0

我正在尝试编写 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=not denied 测试了这个

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

您是否可以有一个忽略空格但将某个字符串作为“未尝试”的例外的语法

4

1 回答 1

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;

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

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

于 2013-09-30T12:36:15.917 回答