ANTLR4:错误的lexer规则匹配
我正处于学习ANTLR4 lexer规则的最开始阶段。我的目标是为Java文件创建一个简单的语法。以下是我到目前为止的情况:ANTLR4:错误的lexer规则匹配,antlr,antlr4,Antlr,Antlr4,我正处于学习ANTLR4 lexer规则的最开始阶段。我的目标是为Java文件创建一个简单的语法。以下是我到目前为止的情况: lexer grammar PropertiesLexer; LineComment : ( LineCommentHash | LineCommentExcl ) -> skip ; fragment LineCommentHash : '#' ~[\r\n]* ; fragment Lin
lexer grammar PropertiesLexer;
LineComment
: ( LineCommentHash
| LineCommentExcl
)
-> skip
;
fragment LineCommentHash
: '#' ~[\r\n]*
;
fragment LineCommentExcl
: '!' ~[\r\n]*
;
fragment WrappedLine
: '\\'
( '\r' '\n'?
| '\n'
)
;
Newline
: ( '\r' '\n'?
| '\n'
)
-> skip
;
Key
: KeyLetterStart
( KeyLetter
| Escaped
)*
;
fragment KeyLetterStart
: ~[ \t\r\n:=]
;
fragment KeyLetter
: ~[\t\r\n:=]
;
fragment Escaped
: '\\' .?
;
Equal
: ( '\\'? ':'
| '\\'? '='
)
;
Value
: ValueLetterBegin
( ValueLetter
| Escaped
| WrappedLine
)*
;
fragment ValueLetterBegin
: ~[ \t\r\n]
;
fragment ValueLetter
: ~ [\r\n]+
;
Whitespace
: [ \t]+
-> skip
;
我的测试文件如下:
# comment 1
# comment 2
#
.key1= value1
key2\:sub=value2
key3 \= value3
key4=value41\
value42
# comment3
#comment4
key=value
当我运行grun时,我得到以下输出:
[@0,30:42='.key1= value1',<Value>,4:0]
[@1,45:60='key2\:sub=value2',<Value>,5:0]
[@2,63:76='key3 \= value3',<Value>,6:0]
[@3,81:102='key4=value41\\r\nvalue42',<Value>,8:0]
[@4,130:138='key=value',<Value>,13:0]
[@5,141:140='<EOF>',<EOF>,14:0]
但是如何让它识别键、相等和值定义?ANTLR的lexer规则匹配尽可能多的字符,这就是为什么您看到所有这些值标记都被创建,它们匹配的字符最多 看起来很适合在这里使用。大概是这样的:
lexer grammar PropertiesLexer;
COMMENT
: [!#] ~[\r\n]* -> skip
;
KEY
: ( '\\' ~[\r\n] | ~[\r\n\\=:] )+
;
EQUAL
: [=:] -> pushMode(VALUE_MODE)
;
NL
: [\r\n]+ -> skip
;
mode VALUE_MODE;
VALUE
: ( ~[\\\r\n] | '\\' . )+
;
END_VALUE
: [\r\n]+ -> skip, popMode
;
lexer grammar PropertiesLexer;
COMMENT
: [!#] ~[\r\n]* -> skip
;
KEY
: ( '\\' ~[\r\n] | ~[\r\n\\=:] )+
;
EQUAL
: [=:] -> pushMode(VALUE_MODE)
;
NL
: [\r\n]+ -> skip
;
mode VALUE_MODE;
VALUE
: ( ~[\\\r\n] | '\\' . )+
;
END_VALUE
: [\r\n]+ -> skip, popMode
;