Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
Compiler construction 如何将歧义语法转换为无歧义语法_Compiler Construction_Ambiguous Grammar - Fatal编程技术网

Compiler construction 如何将歧义语法转换为无歧义语法

Compiler construction 如何将歧义语法转换为无歧义语法,compiler-construction,ambiguous-grammar,Compiler Construction,Ambiguous Grammar,我有一个语法我认为是模棱两可的。我不知道如何消除歧义并将其转换为明确的语法 expr ::= num | lvalue | incrop expr | expr incrop | expr binop expr | (expr) lvalue ::= $expr incrop ::= ++ | -- binop ::= + | - | num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 这就是我想到的: expr ::= nu

我有一个语法我认为是模棱两可的。我不知道如何消除歧义并将其转换为明确的语法

expr    ::= num | lvalue | incrop expr | expr incrop | expr binop expr | (expr)

lvalue  ::= $expr

incrop  ::= ++ | --

binop   ::= + | - |

num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
这就是我想到的:

expr ::=    num expr' | lvalue expr'| incrop expr expr' | (expr) expr'

expr' ::= incrop expr' | binop expr expr' | empty

lvalue  ::= $expr

incrop  ::= ++ | --

binop   ::= + | - |

num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

它是正确的吗?

我认为,正如我写的那样,语法只能由一个无限序列的成对加号或减号来满足,因为
S
的第一个标记必须是
++
--
,后面必须跟一个
S
(依次是
++
--
,后跟
S
,无限大)@supercat它不是整个语法。这是使它模棱两可的部分。这部分本身并不使它模棱两可,因为
S
没有有限的扩展,因此唯一相关的扩展是
AS
。使它模棱两可的必要性取决于使它模棱两可的其他存在。@supercat我刚刚修改了语法。这是实际的语法请看一看,它试图解释如何编写一个没有这些歧义的语法。我认为在编写时,语法只能由一个无限序列的成对加号或减号来满足,因为
S
的第一个标记必须是
++
--
,后面必须跟一个
S
(这反过来又是
++
--
,后面跟着一个
S
,无限大)@supercat它不是整个语法。这是使它模棱两可的部分。这部分本身并不使它模棱两可,因为
S
没有有限的扩展,因此唯一相关的扩展是
AS
。使它模棱两可的必要性取决于使它模棱两可的其他存在。@supercat我刚刚修改了语法。这是实际的语法请看一下,它试图解释如何编写一个没有这些歧义的语法。