2014-03-04 147 views
0

我想分析與@後跟任意數量的字的array namesimple variable而不@再次後跟任意數量的單詞:刪除移/減少警告

陣列名稱例如:@people

簡單變量名稱:person

示例文件,我需要解析:

@people name1 name2 
person name3 name4 

我做了如下規則:

list of record : 
line list_of_record 
{} 
| 
line 
{}; 

line 
: 
AT_SYMBOL string string_list 
{} 
| 
string string_list 
{} 
; 

string_list: 
string string_list 
{} 
| 
string 
{} 
; 
//here string is any string 

但我正在逐漸shift/reduce的警告。可有人請提出某種辦法讓我可以刪除這些警告。

+0

這只是太多的標籤。選一個。 –

回答

1

沒有辦法知道line以該語法結尾。 任何string可以是string_list中的另一項或新的line的開頭。

所以你需要決定如何標記line的結束。如果它是一個直觀的新行字符,那麼你的詞法分析器將不得不將新行標記傳遞給語法。

順便說一下,在自下而上語法中使用左遞歸通常會更好。所以,我建議是這樣的:

lines: /* empty */ 
     | lines line NEWLINE 
     ; 

line : /* empty, to allow for blank lines */ 
     | array 
     | scalar 
     ; 

array: '@' string strings ; 

scalar: string strings ; 

strings: string 
     | strings string 
     ; 

上述要求strings是非空的,所以line需要至少由兩人組成。這可能或可能不是你想要的。

+0

如果你打算使用「@」代替「AT_SYMBOL」,那麼使用''n''而不是'NEWLINE'可能更有意義 –