как настроить правила flex / bison для анализа списка аргументов, разделенных запятыми - PullRequest
6 голосов
/ 04 июня 2011

Я хотел бы иметь возможность анализировать непустой список с одним или несколькими элементами, разделенный запятыми (и необязательно заключенный в скобки), используя правила синтаксического анализа 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
                 {
                     ...
                 }
          ;

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Звучит просто. Скажите, если я что-то пропустил или мой пример не работает

RvalCommaList:
          RvalCommaListLoop
    | '(' RvalCommaListLoop ')'

RvalCommaListLoop:
      Rval
    | RvalCommaListLoop ',' Rval

Rval: INT_LITERAL | WHATEVER

Однако, если вы принимаете rvals, а также этот список, у вас будет конфликт, путающий обычный rval с одним списком элементов. В этом случае вы можете использовать нижеследующее, для чего потребуется '(' ')' вокруг них или 2 элемента перед тем, как отобразится список

RvalCommaList2:
      Rval ',' RvalCommaListLoop
    | '(' RvalCommaListLoop ')'
0 голосов
/ 31 июля 2017
%start input
%%
input:
%empty
| integer_list
;

integer_list
: integer_loop
| '(' integer_loop ')'
;

integer_loop
: INTEGER
| integer_loop COMMA INTEGER 
;
%%
0 голосов
/ 01 июля 2011

Я тоже хочу знать, как это сделать, если кратко подумать, один из способов добиться этого - использовать связанный список формы,

struct list;
struct list {
    void *item;
    struct list *next;
};

struct list *make_list(void *item, struct list *next);

и используя правило:

{ $$ = make_list( $1, $2); }

Это решение очень похоже по дизайну на: Использование бизона для разбора списка элементов

Сложный вопрос - выяснить, как обрабатывать списки в схеме(я предполагаю) двоичный AST.

...