【发布时间】:2011-02-08 13:44:39
【问题描述】:
我正在使用 JavaScript 和 Parsing Expression Grammar 为 Haskell 编写一个词法分析器,我使用的实现是 PEG.js。
我在使它适用于保留字时遇到问题,如下面的简化形式所示:
program = ( word / " " )+
word = ( reserved / id )
id = ( "a" / "b" )+
reserved = ( "aa" )
这里的重点是获取一系列标记,这些标记要么是 a:s 和/或 b:s 的任意序列,要么是序列“aa”,它们之间用空格分隔。
我真正得到的是不是空格的 每个 标记被识别为id 或者应该被识别为id 的标记具有所有初始对 a:s 被吃掉reserved,例如
“aab”被识别为reserved "aa",后跟id "b"。
Haskell 词法规范解决这种歧义的方法是像这样指定 id:
id = ( "a" / "b" )+[BUT NOT reserved]
我尝试使用 PEG 的各种组合来复制它!和 & -operators 来实现相同的效果,但还没有找到让它正常工作的方法。
解决办法:
id = !reserved ( "a" / "b" )+
我在几个地方看到的建议不起作用。
这是特定 PEG 实现、PEG 本身或(希望)我的方法的限制吗?
提前致谢!
【问题讨论】:
标签: javascript parsing lexical-analysis