单个字符

时间:2018-03-28 13:43:35

标签: java antlr4

我对规则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)*;

那么如何创建一个令牌或一个词法分析器,它为我提供了检测一些通用文本的基础(比如类名变量名称还创建规则,其中我必须接受固定的字符序列?

1 个答案:

答案 0 :(得分:1)

确定,

诀窍是"一般范围"令牌VARIABLENAME

换句话说,令牌过于通用

在我的情况下,子条件VARIABLENAME: SINGLELETTER NUMBER* 崩溃 / 碰撞条件mnemonic_format: 'A' INTEGER

(事实上,我可以使用VARIABLENAMEmnemonic_format创建字符串 A100 ,这会产生歧义

所以我"专攻" VARIABLENAME用于接受前缀,例如:

VARIABLENAME
     : HASH (SINGLELETTER|UNDERSCORE)(SINGLELETTER|UNDERSCORE|DOLLAR|NUMBER)*
     | 'class ' (SINGLELETTER|UNDERSCORE)(SINGLELETTER|UNDERSCORE|DOLLAR|NUMBER)*
     ...

这应该避免令牌和规则之间的歧义