Skip to content

Commit

Permalink
Add a NIL parser.
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jul 1, 2010
1 parent 4c90cd6 commit 2aafefe
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions Niecza/Grammar.pm6
Expand Up @@ -24,7 +24,55 @@ grammar Q is STD::Q {
multi method tweak(:$NIL!) { self.cursor_fresh( ::Niecza::Grammar::NIL ) }
}

# mnemonic characters: (@, !, =) fetch, store, lvalue.
# (l) lexical (L) raw lexical
grammar NIL is STD {
rule nibbler { [ <insn> ]* }

token category:insn { <sym> }
proto token insn { <...> }

token varid { [ <sigil> <twigil>? ]? <identifier> }

token clrid { [ \w+ ] ** '.' <clrgeneric>? <clrqual>* }
token clrgeneric { '<' <clrid> ** ',' '>' }
token clrqual { '[]' }

token num { \d+ }

token up { '^' * }

token insn:lextypes {
'LEXICALS:' :s [ [ <varid> ] ** ',' ':' <clrid> ] ** ',' \n
}

token insn:string_lv { "=" <?before "'"> [ :lang(%*LANG<MAIN>) <quote> ] }
token insn:clr_string { <?before "'"> [ :lang(%*LANG<MAIN>) <quote> ] }
token insn:label { ':' {} <num> }
token insn:goto { '->' {} <num> }

token insn:lex_lv { 'l=' {} <up> <varid> }
token insn:rawlexget { 'L@' {} <varid> }
token insn:rawlexput { 'L!' {} <varid> }
token insn:how { <sym> }
token insn:fetchlv { '@' }
token insn:dup_fetchlv { 'dup@' }
token insn:pos { '=[' <?> ~ ']' <num> }
token insn:clone_lex { 'CLONE:' :s [ <varid> ] ** ',' \n }
token insn:copy_lex { 'COPY:' :s [ <varid> ] ** ',' \n }
token insn:call_method { '.method/' {} <num> }
token insn:call_sub { '.call/' {} <num> }
token insn:tail_call_sub { '.tailcall/' {} <num> }
token insn:unwrap { <sym> ':' {} <clrid> }
token insn:new { <sym> '/' {} <num> ':' <clrid> }
token insn:clr_field_get { '@.' {} <varid> }
token insn:clr_field_set { '!.' {} <varid> }
token insn:clr_index_get { '@[' {} <varid>? ']' }
token insn:clr_index_set { '![' {} <varid>? ']' }
token insn:cast { <sym> ':' {} <clrid> }
token insn:clr_call_direct { '.plaincall/' {} <num> ':' <clrid> }
token insn:return { <sym> '/' <[ 0 1 ]> }
token insn:push_null { 'null:' {} <clrid> }
}

}

0 comments on commit 2aafefe

Please sign in to comment.