forked from dabeaz/ply
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This test uses a grammar split into several modules, where the line number of rules are the same in more than one module. This will cause ParserReflect.get_pfunctions to try to sort tuples on module items, which are unsortable in Python 3.
- Loading branch information
1 parent
dbf1226
commit 2e1d1c6
Showing
7 changed files
with
138 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# Tests proper sorting of modules in yacc.ParserReflect.get_pfunctions | ||
|
||
# Here for testing purposes | ||
import sys | ||
if '..' not in sys.path: | ||
sys.path.insert(0, '..') | ||
|
||
from .parsing.calcparse import parser | ||
|
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# ----------------------------------------------------------------------------- | ||
# calclex.py | ||
# ----------------------------------------------------------------------------- | ||
|
||
import ply.lex as lex | ||
|
||
tokens = ( | ||
'NAME','NUMBER', | ||
'PLUS','MINUS','TIMES','DIVIDE','EQUALS', | ||
'LPAREN','RPAREN', | ||
) | ||
|
||
# Tokens | ||
|
||
t_PLUS = r'\+' | ||
t_MINUS = r'-' | ||
t_TIMES = r'\*' | ||
t_DIVIDE = r'/' | ||
t_EQUALS = r'=' | ||
t_LPAREN = r'\(' | ||
t_RPAREN = r'\)' | ||
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' | ||
|
||
def t_NUMBER(t): | ||
r'\d+' | ||
try: | ||
t.value = int(t.value) | ||
except ValueError: | ||
print("Integer value too large %s" % t.value) | ||
t.value = 0 | ||
return t | ||
|
||
t_ignore = " \t" | ||
|
||
def t_newline(t): | ||
r'\n+' | ||
t.lexer.lineno += t.value.count("\n") | ||
|
||
def t_error(t): | ||
print("Illegal character '%s'" % t.value[0]) | ||
t.lexer.skip(1) | ||
|
||
# Build the lexer | ||
import os.path | ||
lexer = lex.lex(optimize=True, outputdir=os.path.dirname(__file__)) | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# ----------------------------------------------------------------------------- | ||
# yacc_simple.py | ||
# | ||
# A simple, properly specifier grammar | ||
# ----------------------------------------------------------------------------- | ||
|
||
from .calclex import tokens | ||
from ply import yacc | ||
|
||
# Parsing rules | ||
precedence = ( | ||
('left','PLUS','MINUS'), | ||
('left','TIMES','DIVIDE'), | ||
('right','UMINUS'), | ||
) | ||
|
||
# dictionary of names | ||
names = { } | ||
|
||
from .statement import * | ||
|
||
from .expression import * | ||
|
||
def p_error(t): | ||
print("Syntax error at '%s'" % t.value) | ||
|
||
import os.path | ||
parser = yacc.yacc(outputdir=os.path.dirname(__file__)) | ||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# This file contains definitions of expression grammar | ||
|
||
def p_expression_binop(t): | ||
'''expression : expression PLUS expression | ||
| expression MINUS expression | ||
| expression TIMES expression | ||
| expression DIVIDE expression''' | ||
if t[2] == '+' : t[0] = t[1] + t[3] | ||
elif t[2] == '-': t[0] = t[1] - t[3] | ||
elif t[2] == '*': t[0] = t[1] * t[3] | ||
elif t[2] == '/': t[0] = t[1] / t[3] | ||
|
||
def p_expression_uminus(t): | ||
'expression : MINUS expression %prec UMINUS' | ||
t[0] = -t[2] | ||
|
||
def p_expression_group(t): | ||
'expression : LPAREN expression RPAREN' | ||
t[0] = t[2] | ||
|
||
def p_expression_number(t): | ||
'expression : NUMBER' | ||
t[0] = t[1] | ||
|
||
def p_expression_name(t): | ||
'expression : NAME' | ||
try: | ||
t[0] = names[t[1]] | ||
except LookupError: | ||
print("Undefined name '%s'" % t[1]) | ||
t[0] = 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# This file contains definitions of statement grammar | ||
|
||
def p_statement_assign(t): | ||
'statement : NAME EQUALS expression' | ||
names[t[1]] = t[3] | ||
|
||
def p_statement_expr(t): | ||
'statement : expression' | ||
t[0] = t[1] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters