diff options
author | ptmcg <ptmcg@austin.rr.com> | 2020-08-16 22:09:57 -0500 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2020-08-16 22:09:57 -0500 |
commit | bcb8242230fc7e0e9c416856d2aa6d9aba7e7e87 (patch) | |
tree | 06d86f4dac42959da63768ca82ab1d8c530bc77f /examples/lua_parser.py | |
parent | 71e061efc2f3fed3dd7f69f280538ec79607da9f (diff) | |
download | pyparsing-git-bcb8242230fc7e0e9c416856d2aa6d9aba7e7e87.tar.gz |
Update lua_parser.py example to include associative arrays and more complete infix notation operators
Diffstat (limited to 'examples/lua_parser.py')
-rw-r--r-- | examples/lua_parser.py | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/examples/lua_parser.py b/examples/lua_parser.py index 880d163..34651dd 100644 --- a/examples/lua_parser.py +++ b/examples/lua_parser.py @@ -9,62 +9,77 @@ """ from https://www.lua.org/manual/5.1/manual.html#8 - chunk ::= {stat [`;´]} [laststat [`;´]] + chunk ::= {stat [';']} [laststat [';']] block ::= chunk - stat ::= varlist `=´ explist | + stat ::= varlist '=' explist | functioncall | do block end | while exp do block end | repeat block until exp | if exp then block {elseif exp then block} [else block] end | - for Name `=´ exp `,´ exp [`,´ exp] do block end | + for Name '=' exp ',' exp [',' exp] do block end | for namelist in explist do block end | function funcname funcbody | local function Name funcbody | - local namelist [`=´ explist] + local namelist ['=' explist] laststat ::= return [explist] | break - funcname ::= Name {`.´ Name} [`:´ Name] + funcname ::= Name {'.' Name} [':' Name] - varlist ::= var {`,´ var} + varlist ::= var {',' var} - var ::= Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name + var ::= Name | prefixexp '[' exp ']' | prefixexp '.' Name - namelist ::= Name {`,´ Name} + namelist ::= Name {',' Name} - explist ::= {exp `,´} exp + explist ::= {exp ','} exp - exp ::= nil | false | true | Number | String | `...´ | function | + exp ::= nil | false | true | Number | String | '...' | function | prefixexp | tableconstructor | exp binop exp | unop exp - prefixexp ::= var | functioncall | `(´ exp `)´ + prefixexp ::= var | functioncall | '(' exp ')' - functioncall ::= prefixexp args | prefixexp `:´ Name args + functioncall ::= prefixexp args | prefixexp ':' Name args - args ::= `(´ [explist] `)´ | tableconstructor | String + args ::= '(' [explist] ')' | tableconstructor | String function ::= function funcbody - funcbody ::= `(´ [parlist] `)´ block end + funcbody ::= '(' [parlist] ')' block end - parlist ::= namelist [`,´ `...´] | `...´ + parlist ::= namelist [',' '...'] | '...' - tableconstructor ::= `{´ [fieldlist] `}´ + tableconstructor ::= '{' [fieldlist] '}' fieldlist ::= field {fieldsep field} [fieldsep] - field ::= `[´ exp `]´ `=´ exp | Name `=´ exp | exp + field ::= '[' exp ']' '=' exp | Name '=' exp | exp - fieldsep ::= `,´ | `;´ + fieldsep ::= ',' | ';' - binop ::= `+´ | `-´ | `*´ | `/´ | `^´ | `%´ | `..´ | - `<´ | `<=´ | `>´ | `>=´ | `==´ | `~=´ | + binop ::= '+' | '-' | '*' | '/' | '^' | '%' | '..' | + '<' | '<=' | '>' | '>=' | '==' | '~=' | and | or - unop ::= `-´ | not | `#´ + unop ::= '-' | not | '#' + +operator precedence: + + or + and + < > <= >= ~= == + | + ~ + & + << >> + .. + + - + * / // % + unary operators (not # - ~) + ^ """ import pyparsing as pp @@ -111,7 +126,7 @@ stat = pp.Forward() laststat = pp.Group(RETURN + explist1) | BREAK # block ::= {stat [';']} [laststat[';']] -block = pp.Group(stat + OPT_SEMI)[1, ...] + pp.Optional(laststat) +block = pp.Group(stat + OPT_SEMI)[1, ...] + pp.Optional(laststat + OPT_SEMI) # field ::= '[' exp ']' '=' exp | Name '=' exp | exp field = pp.Group( @@ -170,10 +185,20 @@ exp_atom = ( | tableconstructor ) +# precedence of operations from https://www.lua.org/manual/5.3/manual.html#3.4.8 exp <<= pp.infixNotation( exp_atom, [ + ("^", 2, pp.opAssoc.LEFT), + (NOT | pp.oneOf("# - ~"), 1, pp.opAssoc.RIGHT), + (pp.oneOf("* / // %"), 2, pp.opAssoc.LEFT), (pp.oneOf("+ -"), 2, pp.opAssoc.LEFT), + ("..", 2, pp.opAssoc.LEFT), + (pp.oneOf("<< >>"), 2, pp.opAssoc.LEFT), + ("&", 2, pp.opAssoc.LEFT), + ("~", 2, pp.opAssoc.LEFT), + ("|", 2, pp.opAssoc.LEFT), + (pp.oneOf("< > <= >= ~= =="), 2, pp.opAssoc.LEFT), (AND, 2, pp.opAssoc.LEFT), (OR, 2, pp.opAssoc.LEFT), ], |