generate: Add comments to lexer
This commit is contained in:
parent
fbc55534f6
commit
5a3d0e19ea
@ -15,6 +15,7 @@ const (
|
|||||||
TokenRBrace
|
TokenRBrace
|
||||||
TokenLBracket
|
TokenLBracket
|
||||||
TokenRBracket
|
TokenRBracket
|
||||||
|
TokenComment
|
||||||
)
|
)
|
||||||
|
|
||||||
var tokenNames = map[parse.TokenKind] string {
|
var tokenNames = map[parse.TokenKind] string {
|
||||||
@ -26,6 +27,7 @@ var tokenNames = map[parse.TokenKind] string {
|
|||||||
TokenRBrace: "RBrace",
|
TokenRBrace: "RBrace",
|
||||||
TokenLBracket: "LBracket",
|
TokenLBracket: "LBracket",
|
||||||
TokenRBracket: "RBracket",
|
TokenRBracket: "RBracket",
|
||||||
|
TokenComment: "Comment",
|
||||||
}
|
}
|
||||||
|
|
||||||
func Lex(fileName string, reader io.Reader) (parse.Lexer, error) {
|
func Lex(fileName string, reader io.Reader) (parse.Lexer, error) {
|
||||||
@ -81,6 +83,18 @@ func (this *lexer) nextInternal() (token parse.Token, err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unexpected := func() error {
|
||||||
|
if unicode.IsPrint(this.rune) {
|
||||||
|
return parse.Errorf (
|
||||||
|
this.pos(), "unexpected rune '%c'",
|
||||||
|
this.rune)
|
||||||
|
} else {
|
||||||
|
return parse.Errorf (
|
||||||
|
this.pos(), "unexpected rune %U",
|
||||||
|
this.rune)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
defer func () {
|
defer func () {
|
||||||
newPos := this.pos()
|
newPos := this.pos()
|
||||||
newPos.End -- // TODO figure out why tf we have to do this
|
newPos.End -- // TODO figure out why tf we have to do this
|
||||||
@ -133,14 +147,21 @@ func (this *lexer) nextInternal() (token parse.Token, err error) {
|
|||||||
token.Kind = TokenRBracket
|
token.Kind = TokenRBracket
|
||||||
appendRune()
|
appendRune()
|
||||||
if this.eof { err = nil; return }
|
if this.eof { err = nil; return }
|
||||||
case unicode.IsPrint(this.rune):
|
// Comment
|
||||||
err = parse.Errorf (
|
case this.rune == '/':
|
||||||
this.pos(), "unexpected rune '%c'",
|
token.Kind = TokenComment
|
||||||
this.rune)
|
appendRune()
|
||||||
|
if this.eof { return }
|
||||||
|
if this.rune != '/' {
|
||||||
|
err = unexpected()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for this.rune != '\n' {
|
||||||
|
appendRune()
|
||||||
|
if this.eof { err = nil; return }
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
err = parse.Errorf (
|
err = unexpected()
|
||||||
this.pos(), "unexpected rune %U",
|
|
||||||
this.rune)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -6,14 +6,21 @@ import "git.tebibyte.media/sashakoshka/goparse"
|
|||||||
|
|
||||||
func TestLex(test *testing.T) {
|
func TestLex(test *testing.T) {
|
||||||
lexer, err := Lex("test.pdl", strings.NewReader(`
|
lexer, err := Lex("test.pdl", strings.NewReader(`
|
||||||
|
// User holds profile information about a single user.
|
||||||
M0001 User {
|
M0001 User {
|
||||||
0000 Name String,
|
0000 Name String,
|
||||||
|
// dog water comment
|
||||||
|
|
||||||
|
// Users is asdkjsagkj why
|
||||||
|
//
|
||||||
|
// wow
|
||||||
0001 Users []User,
|
0001 Users []User,
|
||||||
0002 Followers U32,
|
0002 Followers U32,
|
||||||
}`))
|
}`))
|
||||||
if err != nil { test.Fatal(parse.Format(err)) }
|
if err != nil { test.Fatal(parse.Format(err)) }
|
||||||
|
|
||||||
correctTokens := []parse.Token {
|
correctTokens := []parse.Token {
|
||||||
|
tok(TokenComment, "// User holds profile information about a single user."),
|
||||||
tok(TokenMethod, "0001"),
|
tok(TokenMethod, "0001"),
|
||||||
tok(TokenIdent, "User"),
|
tok(TokenIdent, "User"),
|
||||||
tok(TokenLBrace, "{"),
|
tok(TokenLBrace, "{"),
|
||||||
@ -21,6 +28,10 @@ func TestLex(test *testing.T) {
|
|||||||
tok(TokenIdent, "Name"),
|
tok(TokenIdent, "Name"),
|
||||||
tok(TokenIdent, "String"),
|
tok(TokenIdent, "String"),
|
||||||
tok(TokenComma, ","),
|
tok(TokenComma, ","),
|
||||||
|
tok(TokenComment, "// dog water comment"),
|
||||||
|
tok(TokenComment, "// Users is asdkjsagkj why"),
|
||||||
|
tok(TokenComment, "// "),
|
||||||
|
tok(TokenComment, "// wow"),
|
||||||
tok(TokenKey, "0001"),
|
tok(TokenKey, "0001"),
|
||||||
tok(TokenIdent, "Users"),
|
tok(TokenIdent, "Users"),
|
||||||
tok(TokenLBracket, "["),
|
tok(TokenLBracket, "["),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user