EBNF / parboiled:如何将正则表达式翻译成PEG?
这是一个特定于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库的人,如何实现定义非空白的规则?
没有找到相关结果
已邀请:
2 个回复
械怒等
对于数字。 对于非空白,您需要知道您正在使用哪个字符集。对于7位ASCII,非空白在概念上是所有打印字符:
对于ISO8859-1:
你可以自己决定0x80以上的字符代码是否为空格(空间是不间断的空间?)。您还可以决定控制字符0x0..0x1F的状态。标签(0x9)是一个空白字符? CR 0xD和LF 0xA怎么样? ETB控制字符怎么样? Unicode更难,因为它是一个巨大的集合,你的列表变得庞大而混乱。这就是生活。我们的DMS软件再造工具包用于构建各种语言的解析器,并且必须支持ASCII,ISO8859-z的词法分析器以及许多z和Unicode。 DMS不是编写复杂的“加法”正则表达式范围,而是允许减法正则表达式,因此我们可以编写:
这更容易理解,并在第一次尝试时正确。
岭取
这要求您有一个'anycharacter'文字,用于定义可能符号的整个范围,以及明确定义哪些字符是空格。 在Parboiled中,您可以使用
和
规则执行此操作,例如 nonwhitespace将被定义为与WhiteSpace()规则不匹配的任何字符: