加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – EBNF / parboiled:如何将regexp翻译成PEG?

发布时间:2020-12-15 08:38:42 所属栏目:Java 来源:网络整理
导读:这是一个特定于parboiled解析器框架和一般BNF / PEG的问题. 假设我有一个相当简单的正则表达式 ^s*([A-Za-z_][A-Za-z_0-9]*)s*=s*(S+)s*$ 代表伪EBNF line ::= ws? identifier ws? '=' nonwhitespace ws?ws ::= (' ' | 't' | {other whitespace c
这是一个特定于parboiled解析器框架和一般BNF / PEG的问题.

假设我有一个相当简单的正则表达式

^s*([A-Za-z_][A-Za-z_0-9]*)s*=s*(S+)s*$

代表伪EBNF

<line>               ::= <ws>? <identifier> <ws>? '=' <nonwhitespace> <ws>?
<ws>                 ::= (' ' | 't' | {other whitespace characters})+
<identifier>         ::= <identifier-head> <identifier-tail>
<identifier-head>    ::= <letter> | '_'    
<identifier-tail>    ::= (<letter> | <digit> | '_')*
<letter>             ::= ('A'..'Z') | ('a'..'z')
<digit>              ::= '0'..'9'
<nonwhitespace>      ::= ___________

如何在EBNF中定义非空白(一个或多个不是空格的字符)?

对于熟悉Java parboiled库的人,如何实现定义非空白的规则?

解决方法

您仍然坚持使用词法生成器的约定来指定字符范围和字符范围上的操作.

许多词法分析器生成器接受十六进制值(类似于0x)来表示字符,因此您可以编写:

'0'..'9'
 0x30..x39

对于数字.

对于非空白,您需要知道您正在使用哪个字符集.对于7位ASCII,非空白在概念上是所有打印字符:

0x21..x7E

对于ISO8859-1:

( 0x21..x7E | 0x80-0xFF )

你可以自己决定0x80以上的字符代码是否为空格(空间是不间断的空间?).您还可以决定控制字符0x0..0x1F的状态.标签(0x9)是一个空白字符? CR 0xD和LF 0xA怎么样? ETB控制字符怎么样?

Unicode更难,因为它是一个巨大的集合,你的列表变得庞大而混乱.这就是生活.我们的DMS Software Reengineering Toolkit用于构建各种语言的解析器,并且必须支持ASCII,ISO8859-z的词法分析器以及许多z和Unicode. DMS不是编写复杂的“加法”正则表达式范围,而是允许减法正则表达式,因此我们可以编写:

<UniCodeLegalCharacters>-<UniCodeWhiteSpace>

这更容易理解,并在第一次尝试时正确.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读