我有这样的语法:解决暧昧输入:输入不匹配
grammar MkSh;
script
: (statement
| targetRule
)*
;
statement
: assignment
;
assignment
: ID '=' STRING
;
targetRule
: TARGET ':' TARGET*
;
ID
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
WS
: (' '
| '\t'
| '\r'
| '\n'
) -> channel(HIDDEN)
;
STRING
: '\"' CHR* '\"'
;
fragment
CHR
: ('a'..'z'|'A'..'Z'|' ')
;
TARGET
: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-'|'/'|'.')+
;
与此输入文件:
hello="world"
target: CLASSES
当运行我的解析器我得到这个错误:
line 3:6 mismatched input ':' expecting '='
line 3:15 mismatched input ';' expecting '='
这是因为解析器正在将“target”作为ID而不是TARGET。我希望解析器根据分隔符(':'vs'=')来选择规则。
我该怎么做才能发生?
(这是我的第一个项目的Antlr所以我开到任何东西。)
我想尽管Antlr的语法看起来好像有一大套规则,词法分析仍然是一个独立的任务。因此,了解冒号和等号的解析规则基本上没有关于lexing规则的知识,这些规则决定字符串“target”应该被标记为ID还是TARGET。许多解决方案之一是定义一个包含TARGET和ID的宽松标记,然后检查您的操作标记是否包含上下文的任何非法字符。这也允许更好的错误消息(在分配ID中允许“不允许”)。 – 2014-10-05 07:49:40
@RonBurk你能否详细说明我将如何创建这样的设置?或者指出我在哪里可以找到一个例子?无论如何感谢您的有用评论! – 2014-10-08 18:30:59