ANTLR4将字符串与起始字符串和结束字符匹配

时间:2013-09-29 03:54:36

标签: match antlr4

我正在尝试编写antlr语法,以便我可以在某个ID上创建匹配。

我需要匹配以字符'n'开头并以'd'结尾的字符 这个ID可以有空间。 我想在其他任何地方忽略空白

// lexer/terminal rules start with an upper case letter
ID
  :
    (
    'a'..'z'
    | 'A'..'Z'
    | '0'..'9' 
    | ('+'|'-'|'*'|'/'|'_')
  | '='
  | '~'  
  | '{'
  | '}'
  | ','
  | NA
  )+ 
  ;

NA : 'n'[ ]['a'..'z']'d' ;

WS : [ \t\n]+ -> skip;

我用表达式A1 =未尝试

测试了这个

它认为A1 =不作为ID并尝试作为错误节点

你是否有一个忽略空格的语法,但是对某个字符串的例外是“未尝试”

1 个答案:

答案 0 :(得分:0)

你应该尝试从其余部分中分离ID ("A1")。此外,您需要注意词法规则的优先级。你的“n ... d”应该有更高的优先级,所以把它作为你的第一个词法规则之一。

工作语法(仅针对您的示例测试“A1 =未尝试”是:

statement : ID expr;

expr : OP expr
     | (NA | ID | OP)
     ;

NA : 'n'[a-zA-Z ]*'d' ;

ID
  : (
    'a'..'z'
    | 'A'..'Z'
    | '0'..'9' 
    | ('+'|'-'|'*'|'/'|'_')
    )+ ;

OP : '='
  | '~'  
  | '{'
  | '}'
  | ','
  ;

WS : [ \t\r\n]+ -> skip;

尝试启动规则statement。我更改了NA规则,因此它将按任意顺序匹配零个或多个字符a到z和A到Z和Whitspace。

运气好的ANTLR,它是一个不错的工具。