Antlr4 难以解析数组表示法
我有一个非常简单的语法来解析语句 以下是需要分析的语句类型的示例:Antlr4 难以解析数组表示法,antlr4,Antlr4,我有一个非常简单的语法来解析语句 以下是需要分析的语句类型的示例: a.b.c a.b.c == "88" 我遇到的问题是数组表示法不匹配。例如,不起作用的东西: a.b[0].c a[3][4] 我希望有人能指出我做错了什么。(我正在AntlWorks进行测试) 以下是语法(generationUnit是我的切入点): 语法绑定; 生成单元:testStatement | statement; ArrayAccessor:标识符arrayNotation+; 阵列旋转:'['编号
a.b.c
a.b.c == "88"
我遇到的问题是数组表示法不匹配。例如,不起作用的东西:
a.b[0].c
a[3][4]
我希望有人能指出我做错了什么。(我正在AntlWorks进行测试)
以下是语法(generationUnit
是我的切入点):
语法绑定;
生成单元:testStatement | statement;
ArrayAccessor:标识符arrayNotation+;
阵列旋转:'['编号']';
测试声明:
(语句|字符串|数字|布尔)
(大于等于
|LessthanRequal
|大于
|lessThan | notEquals | equals)
(语句|字符串|数字|布尔)
;
部分:标识符| arrayaccessor;
声明:部分(“.”部分)*;
字符串:(“'identifier'”)|(“\'identifier'\”);
大于等于:“>=”;
lessThanOrEqual:“”;
lessThan:“呸,浪费空间。我在数组声明中使用了数字而不是数字。您在arrayNotation
解析器规则中引用了不存在的规则Number
lexer中确实存在一个数字规则,但它只匹配一个位数。例如,1
是一个数字
,但10
是两个独立的数字
标记,因此a[10]
将与arrayaccessor
规则不匹配。您可能希望通过两个部分来解决此问题:
创建一个由一个或多个数字组成的Number
标记
Number
: Digit+
;
将Digit
标记为一个片段规则,以指示它本身并不形成标记,而仅用于从其他lexer规则引用
fragment // prevents a Digit token from being created on its own
Digit
: ...
您不需要更改阵列旋转
,因为它已经引用了您在此处创建的编号
规则。谢谢,我在发布后一分钟发现了这一愚蠢行为(不好意思)@lennel我注意到了这一点,但仍然添加了此答案,以便将来的用户可以看到更完整的回复。:)
fragment // prevents a Digit token from being created on its own
Digit
: ...