从这个维基百科页面:
无上下文语法和解析表达式语法之间的根本区别在于PEG的选择运算符是有序的.如果第一个替代方案成功,则忽略第二个替代方案.因此,有序选择不是可交换的,不像无上下文选择,如无上下文语法和正则表达式.有序选择类似于某些逻辑编程语言中可用的软切算子.
为什么PEG的选择算子会使匹配短路?是因为最小化内存使用量(由于记忆)?
我不确定正则表达式中的选择运算符是什么,但我们假设它是:/[aeiou]/匹配元音.所以这个正则表达式是可交换的,因为我可以用5个中的任何一个来编写它!元音字符的(五个阶乘)排列?即/[aeiou]/行为相同/[eiaou]/.它是可交换的有什么好处?(参见PEG的非交换性)
结果是,如果CFG直接音译为PEG,则通过从可能的解析中确定性地选择一个解析树来解决前者中的任何歧义.通过仔细选择指定语法备选的顺序,程序员可以很好地控制选择哪个解析树.
这说PEG的语法优于CFG吗?
我想用以下内容的行解析文件:
simple word abbr -8. (012) word, simple phrase, one another phrase - (simply dummy text of the printing; Lorem Ipsum : "Lorem" - has been the industry's standard dummy text, ever since the 1500s!; "It is a long established!"; "Sometimes by accident, sometimes on purpose (injected humour and the like)"; "sometimes on purpose") This is the end of the line
Run Code Online (Sandbox Code Playgroud)
所以现在解释部分(不是所有空格都被描述,因为这里有标记):
simple word 是由空格分隔的一个或多个单词(短语)abbr - 是字符串的固定部分(永远不会改变)8 - 可选号码. - 总是包括在内word, simple phrase, one another phrase …我正在为Mac编写一个开源文本编辑器,并最终达到了我想要添加语法高亮的地步.过去几天我一直在寻找各种解决方案,最后我决定向更广泛的受众提出这个问题.
以下是我看到的选项:
使用正则表达式模式匹配似乎不太理想,因为它不能正式表示语言几乎和正式语法一样好; 然而,一些不太正式的语言将难以适应BNF(即Markdown - 尽管我知道有一个很好的PEG实现).
实时语法高亮显示的性能权衡是什么?多种语言的灵活性如何?
如果我走BNF路线,Todd Ditchendorf创建了令人敬畏的ParseKit框架,它可以很好地开箱即用.任何人都知道PEG的任何类似的东西?