0

我正在尝试使用 ANTLR 4 解析这样的一行:

circle 'my circle' : posx = '800'; posy = '640';

我希望能够在不处理空格、制表符和换行符的情况下解析它,例如:

circle'my circle':posx='800';posy='640';

或者

circle
  'my circle':
 posx='800';  posy=
'640'

我现在的语法是:

grammar Circle;

prog
    : statement*
    ;

statement
    : circle
    ;

circle
    : INDENT? 'circle' '\'' VALUES '\'' ':' params
    ;

params
    : param+
    ;

param
    : ARG '=' '\'' VALUES '\'' ';'
    ;

INDENT : [ \t]+;
VALUES : ARG (ARG)* ;
ARG : [a-zA-Z0-9]+;
WS : [ \t\n\r]+ -> skip;

无论如何试图解析这个:

circle 'my circle' : posx='800'; posy = '640';

我有:

line 1:5 mismatched input ' ' expecting '''

关于如何修复语法以解析上面的行文本跳过空格、制表符、在行中间返回的任何想法?

4

1 回答 1

0

那是因为在您的解析器规则中您要求 WS。就像在圈子中INDENT? 'circle' WS '\'' VALUES '\'' WS ':' params然后在词法分析器规则中一样,您跳过所有 WS[ \t\n\r]+ -> skip;

line 1:5 mismatched input ' ' expecting '''

您会收到此错误,因为在 ARG 中您可以拥有 WS,因此您需要在 lexer ARG 规则中添加 ' '。我不知道 ANTLR 4 但在 ANTLR 3 中它应该是这样的 ARG : ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9'|' ' )+

于 2013-09-29T12:59:48.287 回答