diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-28 01:25:54 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-28 02:59:34 +0900 |
commit | f4bbd20fb97d6b91c9a53492fd945a4ac7ff4e5f (patch) | |
tree | d7c34a9521e130c6181e96d904fc02ef922e5991 /spec/lexer.go | |
parent | Add syntax of fragment (diff) | |
download | cotia-f4bbd20fb97d6b91c9a53492fd945a4ac7ff4e5f.tar.gz cotia-f4bbd20fb97d6b91c9a53492fd945a4ac7ff4e5f.tar.xz |
Add ast action
Diffstat (limited to 'spec/lexer.go')
-rw-r--r-- | spec/lexer.go | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/spec/lexer.go b/spec/lexer.go index a8e46ad..14c4074 100644 --- a/spec/lexer.go +++ b/spec/lexer.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "io" + "strconv" "strings" mldriver "github.com/nihei9/maleeni/driver" @@ -24,6 +25,10 @@ const ( tokenKindSemicolon = tokenKind(";") tokenKindModifierMarker = tokenKind("@") tokenKindActionLeader = tokenKind("#") + tokenKindTreeNodeOpen = tokenKind("'(") + tokenKindTreeNodeClose = tokenKind(")") + tokenKindPosition = tokenKind("$") + tokenKindExpantion = tokenKind("...") tokenKindEOF = tokenKind("eof") tokenKindInvalid = tokenKind("invalid") ) @@ -31,6 +36,7 @@ const ( type token struct { kind tokenKind text string + num int } func newSymbolToken(kind tokenKind) *token { @@ -53,6 +59,13 @@ func newTerminalPatternToken(text string) *token { } } +func newPositionToken(num int) *token { + return &token{ + kind: tokenKindPosition, + num: num, + } +} + func newEOFToken() *token { return &token{ kind: tokenKindEOF, @@ -144,6 +157,22 @@ func (l *lexer) next() (*token, error) { return newSymbolToken(tokenKindModifierMarker), nil case "action_leader": return newSymbolToken(tokenKindActionLeader), nil + case "tree_node_open": + return newSymbolToken(tokenKindTreeNodeOpen), nil + case "tree_node_close": + return newSymbolToken(tokenKindTreeNodeClose), nil + case "position": + // Remove '$' character and convert to an integer. + num, err := strconv.Atoi(tok.Text()[1:]) + if err != nil { + return nil, err + } + if num == 0 { + return nil, synErrZeroPos + } + return newPositionToken(num), nil + case "expansion": + return newSymbolToken(tokenKindExpantion), nil default: return newInvalidToken(tok.Text()), nil } |