在ANTLR4中匹配相同的令牌类型

时间:2014-09-21 19:45:58

标签: antlr antlr4

目前,我的矢量语法就像是数字,字符串,矢量和标识符的集合。

vector:
    '[' elements+=vector_members? (vector_delimiters elements+=vector_members)* ']'
;

vector_delimiters
:
    ','
;

vector_members:
    NUMBER
    | STRING 
    | vector
    | ID
;

现在,有没有办法通过语法强制执行,使得向量只能包含特定类型的元素,如数字或字符串等

1 个答案:

答案 0 :(得分:3)

当然,有一种方法,但这并不意味着它是一个好主意:

vector
    : '[' ']'
    | '[' elements+=NUMBER (vector_delimiters elements+=NUMBER)*  ']'
    | '[' elements+=STRING (vector_delimiters elements+=STRING )* ']'
    | '[' elements+=ID     (vector_delimiters elements+=ID)*      ']'
    | '[' elements+=vector (vector_delimiters elements+=vector)*  ']'
    ;

看,这很难看。

这种验证不应该是语法的一部分。构建访问者以检查一致性规则。代码将更简单,更易于维护,并将尊重关注点分离原则。让解析器进行解析,并在稍后阶段进行验证。作为奖励,您将能够提供比意外令牌更好的错误消息。

作为旁注,你的初始语法将接受这样的结构:[ , 42 ]。您的vector规则应该是:

vector
    : '[' ']'
    | '[' elements+=vector_members (vector_delimiters elements+=vector_members)* ']'
    ;