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
      : ...