antlr4 - Antlr4:用双点解析点尾浮点数
问题描述
我正在尝试用点尾浮点数和双点测距数组解析句子,但无法做到。
这是我的语法文件
grammar foo;
Digits
: [0-9]+
;
Real
: Digits* '.' Digits+
| Digits+ '.' Digits*
;
Range
: '..'
;
Whitespace
: [ \t]+
-> skip
;
Newline
: ( '\r' '\n'?
| '\n'
)
-> skip
;
range
: Digits Range Digits
;
和(文件名为foo.c
)
代码1:
1..2
代码2:
1 ..2
我使用以下来编译和测试:
antlr4 foo.g4
javac foo*.java
grun foo range -gui foo.c
代码 1 会有错误:
line 1:2 token recognition error at: '. '
line 1:0 extraneous input '1.' expecting Digits
line 1:5 mismatched input '<EOF>' expecting '..'
但是我可以使用代码 2 来实现。
添加额外的空间使其正确,但我想要一个可以解析代码 1 而没有额外空间的语法。
解决方案
这就是 ANTLR 词法分析器的工作方式:它尝试匹配尽可能多的字符。所以输入1..2
产生 2 个Real
标记1.
和,而.2
不是 3 个标记Digits
和。Range
Digits
要创建 3 个标记,您必须在词法分析器中添加一个谓词。尝试这样的事情:
FLOAT
: [0-9]+ '.' {_input.LA(1) != '.'}?
| [0-9]* '.' [0-9]+
;
INT
: [0-9]+
;
RANGE
: '..'
;
SPACE
: [ \t\r\n] -> skip
;
如果我根据上面的规则创建一个词法分析器,并将其输入 input "1 2. .34 56..7 8.99999"
,我会得到以下标记:
INT '1'
FLOAT '2.'
FLOAT '.34'
INT '56'
RANGE '..'
INT '7'
FLOAT '8.99999'
推荐阅读
- r - RStudio 可以在运行一行后显示对对象所做的更改次数(如在 Stata 中)?
- spring - Groovy Spock:如何在不立即抛出错误的情况下将新异常传递给 when 方法
- selenium - 获取 InvalidArgumentException
- node.js - 当我删除文件(Strapi + Mongo DB)时,targetModel.updateMany 不是函数
- python - Pyspark 用滑动窗口分解多列
- android - 是否可以在 Graphql 中使用“on”关键字作为参数名称,如果没有,是否可以这样做?
- node.js - 如何在 VSCode 中使用 Node.js 继续“等待调试器断开连接...”
- c# - WPF 中页面和窗口之间的导航
- html - 在同一行的不同列中显示两个不同的索引
- linux - 如何仅从 Shell 脚本中的变量返回整数并丢弃字母和前导零?