Re: Parsing user-defined types
EML <[email protected]>
| Newsgroups | gmane.comp.parsers.bison.general |
|---|---|
| Message-ID | <[email protected]> |
Hi Hans - thanks - that looks good. On 08/05/2019 22:10, Hans Åberg wrote: > >> On 8 May 2019, at 22:30, EML <[email protected]> wrote: >> >> Sometimes, to make the grammar manageable, the lexer has to *dynamically* return 'typename' instead of 'identifier'. Only semantic analysis can determine what is a user-defined type (say 'foo'), so the lexer must be told at runtime that 'foo' is a 'typename' and not an 'identifier'. > > That is done by the method I indicated. In flex have a rule: > > identifier [[:alpha:]][[:alnum:]]+ > > %% > > {identifier} { > std::optional<std::pair<token_type, semantic_type>> x = lookup_table.find(yylval.text); > > if (!x) > return my::yyparser::token::identifier; > > // Set semantic value return to x->second. > > return x->first; > } > > The Bison parser will then get the token of whatever the identifier has been defined to. It will have rules like: > > %token int_definition > %token int_variable > %token identifier > > %% > > definition: > int_definition identifier[x] value[v] { > lookup_table.push($x, {my::yyparser::token::int_variable, $v}); > } > > use_value: > … int_variable[x] … { … $x … } > > > _______________________________________________ [email protected] https://lists.gnu.org/mailman/listinfo/help-bison