python - How to generate a list from a * rule in ANTLR3? -


i have following grammar:

grammar test;  options {   lang = python; }  declaration returns [value]     :     'enum' id { statement* }                  { $value = {'id': $id.text,                              'fields': $statement.value}                  }     ;  statement returns [value]     :     id ':' int ';' { $value = {'id': $id.text, 'value': int($int.text)} }     ; 

to parse syntax of type:

enum test {   foo: 3;   bar: 5; } 

however, struggling getting statement* rule list of statements. want final parsed object like:

declaration = {   'id': 'test',   'fields': [     {'id': 'foo', 'value': 3},     {'id': 'bar', 'value': 5}, } 

i can parse each of statement results correctly, each $statement.value correct. but, given asterisk on statement* in rule declaration, there way can condense list of fields ? hoping have sort of syntax gets me option free.

right takes last statement, returns:

declaration = {   'id': 'test',   'fields': [     {'id': 'bar', 'value': 5}, } 

i want generic solution because grammar has lot of rules of form:

some_declaration       :     keyword id '{' declaration_statement* '}'       ; 

note: coding in python. have tried coding parser followed tree grammar, last element 1 get, rest discarded.

you can this:

declaration returns [value]     :     'enum' id                   { $value = {'id': $id.text,                              'fields': []}                  }            '{' (r=statement                  { $value['fields'].append($r.value) }              )*            '}'     ; 

or can pass fields list statement rule parameter, , append new values there. this:

declaration returns [value]     :     'enum' id                   { $value = {'id': $id.text,                              'fields': []}                  }                  { list = $value['fields']                  }             '{' statement[list]* '}'     ;  statement[list]     :     id ':' int ';' { $list.append({'id': $id.text, 'value': int($int.text)}) }     ; 

depends on want, first option bit nicer.

here can find more examples on returning values 1 rule another: two basic antlr questions


Comments

Popular posts from this blog

python - mat is not a numerical tuple : openCV error -

c# - MSAA finds controls UI Automation doesn't -

wordpress - .htaccess: RewriteRule: bad flag delimiters -