【发布时间】:2021-12-29 02:07:32
【问题描述】:
// Define a grammar called Hello
grammar Hello;
r : element* ;
element
: number Whitespace
| string Whitespace
;
string
: '(' Charactor* ')'
;
Charactor
: [a-zA-Z] |'!' | '"'| '#' | '$' | '%' | '&' | '\'' | '\\(' | '\\)' | '*' | '+' | ',' | '-' | '.' | '/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '[' | '\\' | ']' | '^' | '`' | '{' | '|' | '}' | '~' | '_'
;
number
: '-'? integer ('.' integer)?
;
integer
: digit+
;
digit
: D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9
;
Whitespace
: ' ' | '\n'
;
D1 : '1';
D2 : '2';
D3 : '3';
D4 : '4';
D5 : '5';
D6 : '6';
D7 : '7';
D8 : '8';
D9 : '9';
D0 : '0';
//WS : [ \t\r\n]+ -> skip ; skip spaces, tabs, newlines
我使用上面的.g4语法文件来解析下面的字符序列。
➜ 你好 antlr4 Hello.g4 ➜ 你好 javac Hello*.java ➜ 你好 grun 你好 r 树 1.1 -1.2 333 -222 (((*&^%$#@!~
<>,?"'\|[[]]{}~) (r (element (number (integer (digit 1)) . (integer (digit 1))) ) (element (number - (integer (digit 1)) . (integer (digit 2))) ) (element (number (integer (digit 3) (digit 3) (digit 3))) ) (element (number - (integer (digit 2) (digit 2) (digit 2))) ) (element (string ( \( \( * & ^ % $ # @ ! ~, ? " ' \ | [ [ ] ] { } ~ )) ))
这个案例效果很好。
但是当我输入字符串“1.1 -1.2 333 -222 (-.#$?)”时,它没有正确解析。
➜ Hello grun Hello r -tree 1.1 -1.2 333 -222 (-.#$?) 第 1:19 行不匹配的输入 '-' 需要 {')',Charactor} 行 1:20 不匹配的输入 '.'期待 {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} line 1:21 mismatched input '#' 期待 {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} (r (元素(数字(整数(数字 1))。(整数(数字 1)))) (元素(数字 - (整数(数字 1))。(整数(数字 2)))) (元素 (数字 (整数 (数字 3) (数字 3) (数字 3)))) (元素 (数字 - (整数(数字 2)(数字 2)(数字 2))))(元素(字符串 () ) (element (number - integer . (integer # $ ? ))) )) ➜ 你好
这个特殊的字符序列是一个包含数字或字符串的数组。 该数字可以通过以下方式获得,例如 1.1、-1.2、-222、222 字符串以'('开头,以')'结尾,如果其中出现'('或')',则可以转义。请注意,字符串可以包含字符“-”或“.”。所以当'-'或'.'同时出现在数字和字符串中,好像 Antlr 无法正确解析。
有人知道如何解决这个问题吗?谢谢!
【问题讨论】:
标签: java antlr4 context-free-grammar