如何设置flex/bison规则来解析逗号分隔的参数列表

sri*_*ity 7 parsing yacc lex bison flex-lexer

我希望能够使用flex/bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的带括号的)列表.

一些例如可解析的列表:

  • 1
  • 1,2
  • (1,2)
  • (3)
  • 3,4,5
  • (3,4,5,6-)

等等

我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(在提供有效列表时我得到语法错误).关于我如何设置它的任何建议?

cList :   ELEMENT
           {
              ...
           }
        | cList COMMA ELEMENT
           {
              ...
           }
        ;

topLevelList :  LPAREN cList RPAREN
                 {
                     ...                 
                 }
              | cList
                 {
                     ...
                 }
          ;
Run Code Online (Sandbox Code Playgroud)

小智 5

这听起来很简单。告诉我我是否遗漏了什么或者我的例子不起作用

RvalCommaList:
          RvalCommaListLoop
    | '(' RvalCommaListLoop ')'

RvalCommaListLoop:
      Rval
    | RvalCommaListLoop ',' Rval

Rval: INT_LITERAL | WHATEVER
Run Code Online (Sandbox Code Playgroud)

但是,如果您同时接受 rval 和此列表,则会发生冲突,将常规 rval 与单个项目列表混淆。在这种情况下,您可以使用下面的内容,这将需要在它们周围使用 '('')' 或在它是列表之前需要 2 个项目

RvalCommaList2:
      Rval ',' RvalCommaListLoop
    | '(' RvalCommaListLoop ')'
Run Code Online (Sandbox Code Playgroud)