解析语法时发生 shift-reduce 冲突
Getting shift-reduce conflict while parsing grammar
我正在使用 lark-parser 库中的 LALR(1) 解析。我写了一个语法来解析类似 ORM 的语言。下面粘贴了我的语言示例:
Table1
.join(table=Table2, left_on=[column1], right_on=[column_2])
.group_by(col=[column1], agg=[sum])
.join(table=Table3, left_on=[column1], right_on=[column_3])
.some_column
我的语法是:
start: [CNAME (object)*]
object: "." (CNAME|operation)
operation: [(join|group) (object)*]
join: "join" "(" [(join_args ",")* join_args] ")"
join_args: "table" "=" CNAME
| "left_on" "=" list
| "right_on" "=" list
group: "group_by" "(" [(group_args ",")* group_args] ")"
group_args: "col" "=" list
| "agg" "=" list
list: "[" [CNAME ("," CNAME)*] "]"
%import common.CNAME //# Variable name declaration
%import common.WS //# White space declaration
%ignore WS
当我解析语言时,它被正确解析,但我收到 shift-reduce 冲突警告。我认为这是由于 object: "." (CNAME|operation)
处的碰撞造成的,但我可能错了。还有其他方法可以写这个语法吗?
我认为你应该更换
operation: [(join|group) (object)*]
只有
operation: join | group
您已经允许在
中重复object
start: [CNAME (object)*]
所以在 operation
末尾也允许 object*
是不明确的,导致冲突。
就个人而言,我会选择这样的东西:
start : [ CNAME ("." qualifier)* ]
qualifier: CNAME | join | group
因为我不明白 object
的意义。但这只是一个小的风格差异。
我正在使用 lark-parser 库中的 LALR(1) 解析。我写了一个语法来解析类似 ORM 的语言。下面粘贴了我的语言示例:
Table1
.join(table=Table2, left_on=[column1], right_on=[column_2])
.group_by(col=[column1], agg=[sum])
.join(table=Table3, left_on=[column1], right_on=[column_3])
.some_column
我的语法是:
start: [CNAME (object)*]
object: "." (CNAME|operation)
operation: [(join|group) (object)*]
join: "join" "(" [(join_args ",")* join_args] ")"
join_args: "table" "=" CNAME
| "left_on" "=" list
| "right_on" "=" list
group: "group_by" "(" [(group_args ",")* group_args] ")"
group_args: "col" "=" list
| "agg" "=" list
list: "[" [CNAME ("," CNAME)*] "]"
%import common.CNAME //# Variable name declaration
%import common.WS //# White space declaration
%ignore WS
当我解析语言时,它被正确解析,但我收到 shift-reduce 冲突警告。我认为这是由于 object: "." (CNAME|operation)
处的碰撞造成的,但我可能错了。还有其他方法可以写这个语法吗?
我认为你应该更换
operation: [(join|group) (object)*]
只有
operation: join | group
您已经允许在
中重复object
start: [CNAME (object)*]
所以在 operation
末尾也允许 object*
是不明确的,导致冲突。
就个人而言,我会选择这样的东西:
start : [ CNAME ("." qualifier)* ]
qualifier: CNAME | join | group
因为我不明白 object
的意义。但这只是一个小的风格差异。