2014-03-04 105 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'可能更有意义 –