2014-09-21 30 views
0

当前,我的向量的语法就像它的数字,字符串,向量和标识符的集合。在ANTLR4中匹配相同的标记类型

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

vector_delimiters 
: 
    ',' 
; 

vector_members: 
    NUMBER 
    | STRING 
    | vector 
    | ID 
; 

现在,有一种方法,通过语法来执行,使得载体可含有相同的数字或字符串等特定类型的唯一的元素

回答

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)* ']' 
    ; 
+2

你是绝对正确以为这是个坏主意,但是你提供的代码并没有真正执行,所有的元素都具有相同的类型,除非标识符有自己独特的类型(这将是非常不寻常的)。要做到这一点,你需要以某种方式区分不同类型的ID,单靠语法规则我​​认为这是不可能的。 – sepp2k 2014-09-21 21:04:50

+0

@ sepp2k好点。这是在另一个步骤中验证的另一个理由。 – 2014-09-21 22:10:12