目前,我的矢量语法就像是数字,字符串,矢量和标识符的集合。
vector:
'[' elements+=vector_members? (vector_delimiters elements+=vector_members)* ']'
;
vector_delimiters
:
','
;
vector_members:
NUMBER
| STRING
| vector
| ID
;
现在,有没有办法通过语法强制执行,使得向量只能包含特定类型的元素,如数字或字符串等
答案 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)* ']'
;