ANTLR4:错误的lexer规则匹配

ANTLR4:错误的lexer规则匹配,antlr,antlr4,Antlr,Antlr4,我正处于学习ANTLR4 lexer规则的最开始阶段。我的目标是为Java文件创建一个简单的语法。以下是我到目前为止的情况: lexer grammar PropertiesLexer; LineComment : ( LineCommentHash | LineCommentExcl ) -> skip ; fragment LineCommentHash : '#' ~[\r\n]* ; fragment Lin

我正处于学习ANTLR4 lexer规则的最开始阶段。我的目标是为Java文件创建一个简单的语法。以下是我到目前为止的情况:

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
   ;