Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Parsing 以下语法的回溯递归下降解析器_Parsing_Backtracking_Peg_Recursive Descent - Fatal编程技术网

Parsing 以下语法的回溯递归下降解析器

Parsing 以下语法的回溯递归下降解析器,parsing,backtracking,peg,recursive-descent,Parsing,Backtracking,Peg,Recursive Descent,我正试图找出解析表达式语法的一些细节,但我仍停留在以下问题上: 对于给定语法: a = b Z b = Z Z | Z (其中小写字母表示产品,大写字母表示端子)。 产品“a”应该与字符串“Z”匹配吗 下面是我看到的将上述语法转换为的伪代码,其中每个产品都映射到一个输出两个值的函数。第一个指示解析是否成功。第二个表示解析后在流中的结果位置 defn parse-a (i:Int) -> [True|False, Int] : val [r1, i1] = parse-b(i)

我正试图找出解析表达式语法的一些细节,但我仍停留在以下问题上:

对于给定语法:

a = b Z
b = Z Z | Z
(其中小写字母表示产品,大写字母表示端子)。 产品“a”应该与字符串“Z”匹配吗

下面是我看到的将上述语法转换为的伪代码,其中每个产品都映射到一个输出两个值的函数。第一个指示解析是否成功。第二个表示解析后在流中的结果位置

defn parse-a (i:Int) -> [True|False, Int] :
   val [r1, i1] = parse-b(i)
   if r1 : eat("Z", i1)
   else : [false, i]

defn parse-b1 (i:Int) -> [True|False, Int] :
   val [r1, i1] = eat("Z", i)
   if r1 : eat("Z", i1)
   else : [false, i]

defn parse-b2 (i:Int) -> [True|False, Int] :
   eat("Z", i)

defn parse-b (i:Int) -> [True|False, Int] :
   val [r1, i1] = parse-b1(i)
   if r1 : [r1, i1]
   else : parse-b2(i)
当试图解析输入“Z”上的产品“a”时,上述代码将失败。这是因为“b”的解析函数不正确。它将贪婪地消耗输入中的两个Z并成功,然后再不留下任何东西供a解析。这就是解析表达式语法应该做的吗?福特论文中的伪代码似乎表明了这一点

非常感谢

-Patrick

在PEGs中,析取(替代)确实是有序的。在福特的论文中,操作符被写/称为“有序选择”,这使它区别于|析取操作符


这使得PEG与CFG有着根本的不同。特别是,给定PEG规则
a->bz
b->Z/Z
a
将不匹配
Z
,谢谢您的回复

我更仔细地重读了福特的论文,它重申了你所说的。销钉/操作员既有序又贪婪。因此,上述规则被认为是失败的

-帕特里克