首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PEGjs /不能正常工作?

为什么PEGjs /不能正常工作?
EN

Stack Overflow用户
提问于 2015-03-06 08:51:36
回答 2查看 212关注 0票数 1

我在PEGjs中有一个简单的解析器

代码语言:javascript
复制
start = val
ln = [\n\r]
float = digits:$[-0-9\.]+ { return parseFloat(digits, 10) }
str = str:$(!ln !"\"" .)+
val = float / str

我试着去匹配

代码语言:javascript
复制
-this

但是它没有得到"str“,而是在解析"float”时出现了错误。

代码语言:javascript
复制
Line 1, column 2: Expected [\-0-9.] or end of input but "t" found.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-10 16:11:41

浮点数=数字:$(-0-9.+ !str) {返回parseFloat(位数,10) }

修好了。但这与我在编写350条代码行解析器时学到的内容非常违背直觉.

票数 0
EN

Stack Overflow用户

发布于 2016-10-11 19:00:43

问题是,-处于一些解析器人员所称的float的“领先集”中,因此解析器不知道下面的内容不是float,因此很高兴地继续并尝试解析一个float。PEGjs实现的解析表达式语法样式不会在符号中进行回溯。

避免这种情况的唯一方法是向解析器提供更多信息,说明您试图通过在领先的-集中和在float中避免引入的前导集歧义所做的事情。您可以通过强制解析器在看到[0-9]+后要求-来解决这个问题。事实上,我怀疑您的语法不能准确地表示您想要完成的任务,因为它也允许字符串(如0123-456123.456-789.987.123 )以及float。您需要强制-作为float的第一个可选字符,然后需要一个数字串才能使它正确浮动。

我建议你这样写你的语法:

代码语言:javascript
复制
start = val
ln = [\n\r]
float = digits:$('-'? [0-9]+ '.'? [0-9]*
               / '-'? '.' [0-9]+) { return parseFloat(digits, 10) }
str = str:$(!ln !"\"" .)+
val = float / str

float的第一部分捕捉小数点之前有数字或小数点缺失的情况。第二部分捕捉小数点之前没有数字的情况,但它是存在的,在这种情况下,它强制执行小数点之后的数字要求。

您拥有的是val = float / str而不是val = str / float,这一点也很关键。在尝试匹配float之前,必须尝试匹配str才能正常工作。我不太确定str的定义,但我不知道您要解析哪种语言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28895191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档