我想用array name
解析@
后跟任意数量的单词和simple 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
需要至少包含其中两个。那可能是也可能不是你想要的。