【问题标题】:Antlr rule for Digit is not recognizing digits -数字的 Antlr 规则无法识别数字 -
【发布时间】:2023-02-04 07:13:05
【问题描述】:

我正在尝试使用 Antlr4 扩展现有语法。在 .g4 文件中,除其他规则外,还定义了以下内容:

Digit
 :  ZeroDigit
     | NonZeroDigit
     ;

NonZeroDigit
            :  NonZeroOctDigit
                | '8'
                | '9'
                ;

NonZeroOctDigit
               :  '1'
                   | '2'
                   | '3'
                   | '4'
                   | '5'
                   | '6'
                   | '7'
                   ;

OctDigit
        :  ZeroDigit
            | NonZeroOctDigit
            ;

ZeroDigit
         :  '0' ;


SP
  :  ( WHITESPACE )+ ;

所以最重要的是(不仅仅是作为一种比喻)我添加了以下规则,这些规则应该利用这些现有规则:

ttQL_Query
     : ttQL_TimeClause SP;

ttQL_TimeClause
     : FROM SP? ttQL_DateTime SP? TO SP? ttQL_DateTime; 

ttQL_DateTime
    : ttQL_Date ('T' ttQL_Time ttQL_Timezone)?;

ttQL_Timezone: 'Z' | ( '+' | '-' ) ttQL_Hour ':' ttQL_Minute; 

ttQL_Date: ttQL_Year '-' ttQL_Month '-' ttQL_Day;
ttQL_Time: ttQL_Hour (':' ttQL_Minute (':' ttQL_Second (ttQL_Millisecond)?)?)?;

ttQL_Year: Digit Digit Digit Digit;
ttQL_Month: Digit Digit;
ttQL_Day: Digit Digit;

ttQL_Hour: Digit Digit ;
ttQL_Minute: Digit Digit ;
ttQL_Second: Digit Digit ;
ttQL_Millisecond: '.' ( Digit )+;


FROM : ( 'F' | 'f' ) ( 'R' | 'r' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ;
TO : ( 'T' | 't' ) ( 'O' | 'o' ) ;

这应该是开放密码查询语言的扩展(语法可以在这里找到:http://opencypher.org/resources/)但我没有让它工作。它应该作为密码查询的前缀。规则很简单:

ttQL
     : SP? ttQL_Query SP? oC_Cypher ;

因此,所有其他现有规则以及我在开头所述的规则都在 oC_Cypher 中使用。我将所有规则放在 antlr 文件之上,并在尝试解析如下查询时:

FROM 2123-12-13T12:34:39Z TO 2123-12-13T14:34:39.2222Z MATCH (a)-[x]->(b) WHERE a.ping > 22" RETURN a.ping, b"

我的解析器收到以下错误消息:

line 1:5 mismatched input '2123' expecting Digit
line 1:10 mismatched input '12' expecting Digit
line 1:13 mismatched input '13' expecting Digit
line 1:29 mismatched input '2123' expecting Digit
line 1:34 mismatched input '12' expecting Digit
line 1:37 mismatched input '13' expecting Digit

奇怪的是,当我把我的语法部分放在一个新的 .g4 文件中并仅为前缀部分 FROM 2123-12-13T12:34:39Z TO 2123-12-13T14:34:39.2222Z 创建一个解析器时,一切都像魅力一样。我有点迷路了。我正在使用 vscode、java、maven 和 ANTLR4 插件以及 ANTLR 版本 4.9.2、mvn-compiler-plugin 3.10.1、java 版本 11

这里有什么问题?

【问题讨论】:

  • “除了其他规则”我猜那些其他规则包括一次匹配多个数字的词法分析器规则?在你使用的语法版本中,你可能没有这样的规则。
  • 请添加产生该错误的完整语法和输入源。最少的语法不足以帮助您。

标签: java parsing visual-studio-code antlr antlr4


【解决方案1】:

我建议为所有词法分析器规则添加一个 fragment 前缀,Digits 和 SP 除外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多