2017-07-29 20 views
0

後続の関数パラメータの(1)BNF文法IはThe Complete Syntax of Luaからこれら二つの規則によって記述言語のBNF形式でLR(1)文法を記述したいと思います。私が試みたLR省略記号

parlist ::= namelist [`,´ `...´] | `...´ 
namelist ::= Name {`,´ Name} 

以下の文法が、私は使用していますツールによると、両方の「シフト減らすために紛争を伴うLR(1)ではない」です。

parlist ::= namelist 
parlist ::= namelist , ... 
parlist ::= ... 

namelist ::= Name namelist1 
namelist1 ::= , Name namelist1 
namelist1 ::= <epsilon> 

parlist ::= namelist 
parlist ::= namelist , ... 
parlist ::= ... 

namelist ::= namelist1 Name 
namelist1 ::= namelist1 Name , 
namelist1 ::= <epsilon> 

この言語には、BNF形式のLR(1)文法がありますか?ここで

+0

:それはまた、LRを、それを作るLALR(1)、(1)ですか? –

答えて

0

は単純なものです:人工namelist1を使用して文法のではなく人工的な歪み

parlist ::= namelist 
parlist ::= namelist , ... 
parlist ::= ... 
namelist ::= Name 
namelist ::= namelist , Name 

parlist ::= Name 
parlist ::= ... 
parlist ::= Name , parlist 

はここで左再帰されているという利点があり、わずかに少ないシンプルなものですLL文法から取り出されたように見える非終端記号は、問題を引き起こしているだけです。 (これは文法LL(1)を作成していませんが、上記の最初の選択肢を考慮に入れて簡単に行うことができます)

0

ここでは競合のないバイソン文法があります。あなたが:: =名前リスト、NAME`ルール `名前リスト:: = NAME`と`名前リストを使用していないのはなぜ

%token ELIPSES COMMA NAME 
%% 
parlist : namelist parlistsuffix 
     | ELIPSES 
     ; 
parlistsuffix: COMMA ELIPSES 
     | /* epsilon */ 
     ; 
namelist: namelist COMMA NAME 
     | NAME 
     ; 
関連する問題