【发布时间】: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