我对规则mnemonic_format
有疑问。
相反,为了识别像 A100 这样的简单文本,它会出现以下错误:
输入不匹配' A100'期待' A'
语法是:
grammar SimpleMathGrammar;
INTEGER : [0-9]+;
FLOAT : [0-9]+ '.' [0-9]+;
ADD : '+';
SUB : '-';
DOT : '.';
AND : 'AND';
BACKSLASH : '\\';
fragment SINGLELETTER : ( 'a'..'z' | 'A'..'Z');
fragment LOWERCASE : 'a'..'z';
fragment UNDERSCORE : '_';
fragment DOLLAR : '$';
fragment NUMBER : '0'..'9';
VARIABLENAME
: SINGLELETTER
| (SINGLELETTER|UNDERSCORE) (SINGLELETTER | UNDERSCORE | DOLLAR | NUMBER)*;
HASH : '#';
/* PARSER */
operation
: (INTEGER | FLOAT) ADD (INTEGER | FLOAT)
| (INTEGER | FLOAT) SUB (INTEGER | FLOAT);
operation_with_backslash : BACKSLASH operation BACKSLASH;
mnemonic: HASH VARIABLENAME HASH;
mnemonic_format
// Example: A100
: 'A' INTEGER;
此时,我知道令牌VARIABLENAME
不应包含字符 A (如果我错了,请更正我)
那么我能做些什么呢?在不同的规则中包含单个字符(o固定序列)? (这是我的错误?)
编辑:我在以下令牌案例中找到问题的根源(通过删除所有其他令牌和规则):
VARIABLENAME: (SINGLELETTER|UNDERSCORE) (SINGLELETTER | UNDERSCORE | DOLLAR | NUMBER)*;
那么如何创建一个令牌或一个词法分析器,它为我提供了检测一些通用文本的基础(比如类名或变量名称)还创建规则,其中我必须接受固定的字符序列?
答案 0 :(得分:1)
确定,
诀窍是"一般范围"令牌VARIABLENAME
。
换句话说,令牌过于通用。
在我的情况下,子条件VARIABLENAME: SINGLELETTER NUMBER*
崩溃 / 碰撞条件mnemonic_format: 'A' INTEGER
(事实上,我可以使用VARIABLENAME
或mnemonic_format
创建字符串 A100 ,这会产生歧义)
所以我"专攻" VARIABLENAME
用于接受前缀,例如:
VARIABLENAME
: HASH (SINGLELETTER|UNDERSCORE)(SINGLELETTER|UNDERSCORE|DOLLAR|NUMBER)*
| 'class ' (SINGLELETTER|UNDERSCORE)(SINGLELETTER|UNDERSCORE|DOLLAR|NUMBER)*
...
这应该避免令牌和规则之间的歧义