我在PEGjs中有一个简单的解析器
start = val
ln = [\n\r]
float = digits:$[-0-9\.]+ { return parseFloat(digits, 10) }
str = str:$(!ln !"\"" .)+
val = float / str我试着去匹配
-this但是它没有得到"str“,而是在解析"float”时出现了错误。
Line 1, column 2: Expected [\-0-9.] or end of input but "t" found.发布于 2015-03-10 16:11:41
浮点数=数字:$(-0-9.+ !str) {返回parseFloat(位数,10) }
修好了。但这与我在编写350条代码行解析器时学到的内容非常违背直觉.
发布于 2016-10-11 19:00:43
问题是,-处于一些解析器人员所称的float的“领先集”中,因此解析器不知道下面的内容不是float,因此很高兴地继续并尝试解析一个float。PEGjs实现的解析表达式语法样式不会在符号中进行回溯。
避免这种情况的唯一方法是向解析器提供更多信息,说明您试图通过在领先的-集中和在float中避免引入的前导集歧义所做的事情。您可以通过强制解析器在看到[0-9]+后要求-来解决这个问题。事实上,我怀疑您的语法不能准确地表示您想要完成的任务,因为它也允许字符串(如0123-456或123.456-789.987.123 )以及float。您需要强制-作为float的第一个可选字符,然后需要一个数字串才能使它正确浮动。
我建议你这样写你的语法:
start = val
ln = [\n\r]
float = digits:$('-'? [0-9]+ '.'? [0-9]*
/ '-'? '.' [0-9]+) { return parseFloat(digits, 10) }
str = str:$(!ln !"\"" .)+
val = float / strfloat的第一部分捕捉小数点之前有数字或小数点缺失的情况。第二部分捕捉小数点之前没有数字的情况,但它是存在的,在这种情况下,它强制执行小数点之后的数字要求。
您拥有的是val = float / str而不是val = str / float,这一点也很关键。在尝试匹配float之前,必须尝试匹配str才能正常工作。我不太确定str的定义,但我不知道您要解析哪种语言。
https://stackoverflow.com/questions/28895191
复制相似问题