簡體   English   中英

具有尾隨省略號的函數參數的LR(1)BNF語法

[英]LR(1) BNF grammar for function parameters with trailing elipsis

我想以BNF形式針對《 Lua的完整語法》中這兩個規則描述的語言編寫LR(1)語法:

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

我已經嘗試了以下語法,但是根據我使用的工具,由於“ shift-reduce沖突”,兩者都是“不是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)語法?

這是一個簡單的例子:

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

這是一個不太簡單的方法,它具有左遞歸的優點:

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

使用人為的namelist1非終結namelist1對人為的語法進行相當人為的變形,這似乎是從LL語法中提取出來的,這只會引起問題。 (盡管也可以通過左因子分解上述第一種選擇來輕松完成語法LL(1)的編寫。)

這是沒有沖突的野牛語法。 是LALR(1),這也使其成為LR(1):

%token ELIPSES COMMA NAME
%%
parlist : namelist parlistsuffix
        | ELIPSES
        ;
parlistsuffix: COMMA ELIPSES
        | /* epsilon */
        ;
namelist: namelist COMMA NAME
        | NAME
        ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM