| parrotcode: parser for Parrot Intermediate Representation | |
| Contents | Compilers | 

pirparser.c - parser for Parrot Intermediate Representation


The parser_state structure has the following fields:
 typedef struct parser_state {
   struct     lexer_state *lexer; -- the lexer
   token      curtoken;           -- the current token as returned by the lexer
   char     **heredoc_ids;        -- array for holding heredoc arguments
   unsigned   heredoc_index;      -- index to keep track of heredoc ids in the array
   unsigned   parse_errors;       -- counter for parse_errors
   pirvtable *vtable;             -- vtable holding pointers for output routines
 }

void exit_parser(parser_state *p)int get_parse_errors(parser_state *p)parser_state *new_parser(char const *filename, pirvtable *vtable)struct lexer_state const *get_lexer(parser_state *p)token get_token(parser_state *p)
static void resize_heredoc_args(parser_state *p)static void syntax_error(parser_state *p, int numargs, ...)static void match(parser_state *p, token expected)

The following conventions are used:
 [ foo ]       indicate an optional foo element
 { foo }       indicate zero or more foo elements
 ( foo | bar ) either foo or bar
 IDENTIFIER    match a token of type IDENTIFIER
 'string'      match the literal 'string'

static token expression(parser_state *p)  expression -> ( IDENTIFIER | INTC | NUMC | STRINGC | register )
static void string_value(parser_state *p)  string_value -> SREG | PASM_SREG | STRINGC
static void method(parser_state *p)  method -> IDENTIFIER | STRINGC
static void target(parser_state *p)  target   -> register | IDENTIFIER
static void type(parser_state *p)  type -> 'int' | 'num' | 'pmc' | 'string'
static void key(parser_state *p)  key -> '-' expression | '..' expression | expression [ '..' [ expression ] ]
static void keylist(parser_state *p)  keylist -> '[' key { (';'|',') key } ']'
static void arg_flags(parser_state *p)  arg_flags -> { arg_flag }
  arg_flag -> ':flat' | ':named' [ '(' STRINGC ')' ]
static void argument(parser_state *p)  argument -> HEREDOCID | expression arg_flags | STRINGC ('=>' expression | arg_flags)
static void argument_list(parser_state *p)  argument_list -> argument { ',' argument }
static void arguments(parser_state *p)  arguments -> '(' [argument_list] ')' heredoc_arguments
  heredoc_arugments -> { HEREDOC_STRING }
static void methodcall(parser_state *p)  methodcall -> INVOCANT_IDENT method arguments
static void arith_expression(parser_state *p)  arith_expr -> [ binop expression ]
  binop      -> '+'  | '-' | '*'  | '/' | '//' | '%'  | '~~'  | '~'
              | '&&' | '&' | '||' | '|' | '<<' | '>>' | '>>>' | '.'
static void parrot_instruction(parser_state *p)  parrot_instruction -> PARROT_OP [ expression {',' expression } ]
static void assignment(parser_state *p)  assignment -> '=' ( unop expression
                    | expression arith_expr
                    | target ( keylist | arguments )
                    | STRINGC arguments
                    | 'global' STRINGC
                    | heredocstring
                    | methodcall
                    | 'null'
                    | parrot_instruction
                    )
  unop       -> '-' | '!' | '~'
static void return_statement(parser_state *p)  return_statement -> '.return' ( arguments
                                | target arguments
                                | methodcall
                                )
                                '\n'
static void yield_statement(parser_state *p)  yield_statement -> '.yield' arguments '\n'
static void local_id_list(parser_state *p)  local_id_list -> local_id { ',' local_id }
  local_id  -> IDENTIFIER [':unique_reg']
static void declaration_list(parser_state *p)  declaration_list -> type local_id_list '\n'
static void local_declaration(parser_state *p)  local_declaration -> '.local' declaration_list
static void lex_declaration(parser_state *p)  lex_declaration -> '.lex' STRINGC ',' target '\n'
static void conditional_expression(parser_state *p)  conditional_expression -> expression [cond_op expression]
  cond_op -> '>' | '>=' | '<' | '<=' | '==' | '!='
static void jump_statement(parser_state *p)  jump_statement -> 'goto' IDENTIFIER '\n'
static void goto_statement(parser_state *p)  goto_statement -> jump_statement
static void unless_statement(parser_state *p)  unless_statement -> 'unless' (['null'] expression | conditional_expression) jump_statement
static void if_statement(parser_state *p)  if_statement -> 'if' (['null'] expression | conditional_expression) jump_statement
static void const_definition(parser_state *p)  const_definition -> 'int' IDENTIFIER '=' INTC
                    | 'num' IDENTIFIER '=' NUMC
                    | 'pmc' IDENTIFIER '=' STRINGC
                    | 'string' IDENTIFIER '=' STRINGC
static void param_flags(parser_state *p)  param_flags -> { param_flag }
  param_flag -> ':slurpy'
              | ':named'['(' STRINGC ')']
              | ':unique_reg'
              | ':optional'
              | ':opt_flag'
static void invokable(parser_state *p)  invokable -> IDENTIFIER | PREG
static void long_invocation(parser_state *p)  long-invocation -> '.begin_call' '\n'
                     { '.arg' expression arg_flags }
                     ( '.call'|'.nci_call') invokable '\n'
                     | '.invocant' invokable '\n'
                       '.meth_call' method '\n'
                     )
                     { (local_declaration | '.result' target param_flags '\n') }
                     '.end_call' '\n'
static void long_return_statement(parser_state *p)  long_return_statement -> '.begin_return' '\n'
                           { '.return' expression arg_flags '\n' }
                           '.end_return' '\n'
static void long_yield_statement(parser_state *p)  long_yield_statement -> '.begin_yield' '\n'
                          { '.return' expression arg_flags '\n' }
                          '.end_yield' '\n'
static void target_statement(parser_state *p)  target_statement -> target ( '=' assignment
                             | augmented_op expression
                             | keylist '=' expression
                             | arguments
                             )
                             '\n'
  augmented_op     -> '+=' | '-=' | '%=' | '/='  | '//=' | '*='  | '.='
                    | '~=' | '&=' | '|=' | '**=' | '<<=' | '>>=' | '>>>='
static void target_list(parser_state *p)  target_list -> '(' target param_flags {',' target param_flags } ')'
static void multi_result_invocation(parser_state *p)  multi-result-invocation -> target_list '=' (invokable arguments | methodcall) '\n'
  invokable -> IDENTIFIER | PREG | STRINGC
static void macro_expansion(parser_state *p)  macro_expansion -> MACRO_IDENT [ '(' [ expression { ',' expression } ')' ] '\n'
static void get_results_instruction(parser_state *p)  get_results_instr -> '.get_results' target_list '\n'
static void global_assignment(parser_state *p)  global_assignment -> 'global' string_value '=' (IDENTIFIER|PREG) '\n'
static void instructions(parser_state *p)  instructions -> {instruction}
  instruction  -> {LABEL ['\n']} instr
  instr -> if_statement
         | unless_statement
         | local_declaration
         | lex_declaration
         | '.globalconst' const_definition
         | '.const' const_definition
         | return_statement
         | yield_statement
         | macro_expansion
         | target_statement
         | STRINGC arguments
         | methodcall
         | long_invocation
         | long_return_statement
         | long_yield_statement
         | 'null' var
         | get_results_instruction
         | global_assignment
         | '\n'
static void multi_type_list(parser_state *p)  multi-type-list -> '(' [multi-type {',' multi-type } ] ')'
  multi-type -> IDENTIFIER | STRINGC | keylist | type
static void sub_flags(parser_state *p)  sub_flags -> [sub_flag { sub_flag } ]
  sub_flag  -> ':anon'
             | ':init'
             | ':load'
             | ':main'
             | ':method'
             | ':lex'
             | ':outer' '(' ( STRINGC | IDENTIFIER )  ')'
             | ':vtable' '(' STRINGC ')'
             | ':multi' multi-type-list
             | ':postcomp'
             | ':immediate'
static void parameters(parser_state *p)  parameters -> { '.param' parameter[param_flag] '\n' }
  parameter -> type [ STRING_CONSTANT '=>' ] IDENTIFIER
static void sub_definition(parser_state *p)  sub_definition -> '.sub' (IDENTIFIER | STRINGC) subflags '\n' parameters instructions '.end'
static void macro_parameters(parser_state *p)  macro_parameters -> [ '(' [ id {',' id} ] ')' ]
static void macro_definition(parser_state *p) macro-definition -> '.macro' IDENTIFIER macro_parameters '\n' macro_body '.endm'
static void include(parser_state *p)  include -> '.include' STRINGC
static void pragma(parser_state *p)  pragma -> '.pragma' 'n_operators' INTC
static void hll_specifier(parser_state *p)  hll_specifier -> '.HLL' STRINGC ',' STRINGC
static void hll_mapping(parser_state *p)  hll_mapping -> '.HLL_map' STRINGC ',' STRINGC
static void namespace_declaration(parser_state *p)  namespace_declaration -> '.namespace' [ '[' STRINGC { (','|';') STRINGC ']' ]
static void loadlib(parser_state *p)  loadlib -> '.loadlib' STRINGC
static void compilation_unit(parser_state *p)  compilation_unit -> sub_definition
                    | '.const' const_definition
                    | include
                    | macro_definition
                    | pragma
                    | loadlib
                    | namespace_declaration
                    | hll_specifier
                    | hll_mapping
static void program(parser_state *p)  program -> {'\n'} compilation_unit { '\n' compilation_unit } EOF
void TOP(parser_state *p)  TOP -> program
|  |   |