Python 获取shift可以减少语法解析时的冲突

Python 获取shift可以减少语法解析时的冲突,python,parsing,lark-parser,Python,Parsing,Lark Parser,我正在使用lark解析器库中的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:

我正在使用lark解析器库中的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冲突警告。我相信这是由于
对象:“.”(CNAME |操作)
处的碰撞造成的,但我可能错了。有没有别的方法写这段语法?

我想你应该把它替换掉

operation: [(join|group) (object)*]
仅仅

operation: join | group
您已经允许在中重复
对象

start: [CNAME (object)*]
因此,在
操作
结束时允许
对象*
也是不明确的,从而导致冲突

就我个人而言,我会选择这样的方式:

start    : [ CNAME ("." qualifier)* ]
qualifier: CNAME | join | group

因为我看不到
对象的意义。但这只是一个小小的风格差异。

我认为你应该换一个

operation: [(join|group) (object)*]
仅仅

operation: join | group
您已经允许在中重复
对象

start: [CNAME (object)*]
因此,在
操作
结束时允许
对象*
也是不明确的,从而导致冲突

就我个人而言,我会选择这样的方式:

start    : [ CNAME ("." qualifier)* ]
qualifier: CNAME | join | group
因为我看不到
对象的意义。但这只是一个小的风格差异