summaryrefslogtreecommitdiff
path: root/examples/lua_parser.py
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2020-08-16 22:09:57 -0500
committerptmcg <ptmcg@austin.rr.com>2020-08-16 22:09:57 -0500
commitbcb8242230fc7e0e9c416856d2aa6d9aba7e7e87 (patch)
tree06d86f4dac42959da63768ca82ab1d8c530bc77f /examples/lua_parser.py
parent71e061efc2f3fed3dd7f69f280538ec79607da9f (diff)
downloadpyparsing-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.py69
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),
],