首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将EBNF语法转换为PEG

将EBNF语法转换为PEG
EN

Stack Overflow用户
提问于 2018-10-29 21:12:01
回答 1查看 984关注 0票数 4

我有一个EBNF语法,并希望将它转换为PEG (https://github.com/anatoo/PHPPEG):

代码语言:javascript
代码运行次数:0
运行
复制
query = { word | wildcard }
word = ( [apostrophe] ( letter { alpha } ) ) | ” , ”
letter = ” a ” | ... | ” z ” | ” A ” | ... | ” Z ”
alpha = letter | ” 0 ” | ... | ” 9 ”
apostrophe = ” ’ ”
wildcard = ” ? ” | ” * ” | synonyms | multiset | optionset
synonyms = ” ~ ” word
multiset = ” { ” word { word } ” } ”
optionset = ” [ ” word { word } ” ] ”

有人能解释如何从一个转换到另一个,或者如果有什么地方我可以读到它吗?

谢谢!

代码语言:javascript
代码运行次数:0
运行
复制
• the question mark (?), which matches exactly one word;
• the asterisk (*), which matches any sequence of words;
• the tilde sign in front of a word (∼<word>), which matches any of the word’s synonyms;
• the multiset operator ({<words>}), which matches any ordering of the enumerated words; and,
• the optionset operator ([<words>]), which matches any one word from a list of options.
EN

回答 1

Stack Overflow用户

发布于 2018-11-05 13:27:21

有几个Peg实现,然后所有这些都为Peg选择的一般约定添加了一些内容,它们是:

  • 操作符"*“、"+”和"?“具有与正则表达式相同的含义;
  • 替代方案实际上是优先级选择,它们使用"/“运算符来表示这种差异;
  • 操作人员"&“和"!”指定正的和负的零长度前瞻性(即它们不提前“当前”指针);

在EBNF中,重复用"{ }“表示,在Peg中用"*”操作符表示,意思是主题的零或多次重复。例如,您的第一个语法规则可以在假设的Peg实现中表示如下:

代码语言:javascript
代码运行次数:0
运行
复制
query = (word / wildcard)* 

EBNF“”操作符与Peg的"?“有相同的含义。运算符,意味着主题是可选的。这是您的第二个规则,因为它可以转换为Peg:

代码语言:javascript
代码运行次数:0
运行
复制
word = (apostrophe?  letter alpha*) / ","

最后,几个Peg实现允许在语法中直接使用正则表达式。看看您的第三条规则是如何在这样的Peg中表示的:

代码语言:javascript
代码运行次数:0
运行
复制
letter = [a-zA-Z]

对于您正在使用的语言和特定的Peg实现,可能会有一些变化,但我希望这些指导方针能为您指明正确的方向。

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

https://stackoverflow.com/questions/53053899

复制
相关文章

相似问题

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