Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EBNF/parboiled:如何将regexp转换为PEG?_Java_Parsing_Ebnf_Parboiled - Fatal编程技术网

Java EBNF/parboiled:如何将regexp转换为PEG?

Java EBNF/parboiled:如何将regexp转换为PEG?,java,parsing,ebnf,parboiled,Java,Parsing,Ebnf,Parboiled,这是一个特定于Parboach解析器框架和BNF/PEG的问题 假设我有一个相当简单的正则表达式 ^\\s*([A-Za-z_][A-Za-z_0-9]*)\\s*=\\s*(\\S+)\\s*$ 表示的伪EBNF <line> ::= <ws>? <identifier> <ws>? '=' <nonwhitespace> <ws>? <ws> ::

这是一个特定于Parboach解析器框架和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>      ::= ___________
::=??'='?
::=(“”|’\t’|{其他空白字符})+
::=  
::=  | '_'    
::= ( |  | '_')*
::=('A'..'Z')|('A'..'Z'))
::= '0'..'9'
::= ___________
如何在EBNF中定义非空白字符(一个或多个非空白字符)


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

您必须遵守词汇生成器用于指定字符范围和字符范围操作的约定

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

 '0'..'9'
 0x30..\0x39
数字

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

0x21..\0x7E
对于ISO8859-1:

( 0x21..\0x7E | 0x80-0xFF )
您可以自行决定0x80以上的字符代码是否为空格(非中断空格是否为空格?)。您还可以决定控制字符0x0..0x1F的状态。制表符(0x9)是空白字符吗?CR 0xD和LF 0xA怎么样?ETB控制字符如何

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

 <UniCodeLegalCharacters>-<UniCodeWhiteSpace>
-

这更容易理解,第一次尝试就正确了。

在EBNF中,我只需将非空白字符定义为非空白字符:

nonwhitespace ::= anycharacter - whitespace
这要求您有一个“anycharacter”文本来定义可能符号的整个范围,并明确定义哪些字符是空白

在Parboiled中,您可以使用
TestNot
ANY
规则执行此操作,例如 非空白将被定义为与空白()规则不匹配的任何字符:


等等,重复量词在哪里?就我所能读到的语法而言,只能有一个字母etcsee
标识符尾部
嗯,好吧,我试着把它作为EBNF语法来读,而
*
应该在paren之前。。。
Sequence( TestNot(WhiteSpace()) , ANY )