我正在为一种语言创建antlr4语法,该语言对于变量声明前缀有多种可能,例如变量声明可以是以下任意一种:
IDENTIFIER
PREFIX1 IDENTIFIER
PREFIX2 IDENTIFIER
PREFIX1 PREFIX2 IDENTIFIER
PREFIX2 PREFIX1 IDENTIFIER
和前缀是可选的,并且可以以任何顺序使用,但每个前缀最多使用一个。
如果我有规则:
var_declaration: (PREFIX1 | PREFIX2)? IDENTIFIER;
然后将不处理任何类型的单个前缀或单个前缀。如何处理无序,无序或无序但又防止两个前缀相同?
答案 0 :(得分:1)
没有特殊的语法。您将定义所有替代方案:
var_declaration
: PREFIX1 PREFIX2 IDENTIFIER
| PREFIX2? PREFIX1? IDENTIFIER
;
如果前缀超过2个,列出它们将变得冗长。在这种情况下,最好将其中任何一个匹配零次或多次:
var_declaration
: prefix* IDENTIFIER
;
prefix
: PREFIX1
| PREFIX2
| PREFIX3
;
,然后在分析后(使用树侦听器)检查匹配的前缀是否唯一。