3

py�\�
�@s�ddlZdZejje�ddlmZmZGdd�de�ZGdd�de�Ze	dkr�e�Z
e�Zxnyed	�Z
Wnek
r�PYnXe
r^d
Zer�ee
je
��Zee�ee�Zeje�q^eje
je
��q^WdS)�Nz2/u1/h0/jkinne/public_html/cs420-s2019/code/sly-0.4)�Lexer�Parserc@sjeZdZeeeeeee	e
eee
hZdZdZdZ
dZdZdZdZdZd	Zd
Z	dZ
dZd
Zdd�Zdd�ZdS)�	CalcLexerz 	�%Zincz[a-zA-Z_][a-zA-Z0-9_]*z\d+z\+�-z\*�/�=z\(z\)z\n+cCs|j|jjd�7_dS)N�
)�lineno�value�count)�self�t�r�5/u1/h0/jkinne/public_html/cs420-s2019/code/slyCalc.py�ignore_newline3szCalcLexer.ignore_newlinecCs$td|jd�|jd7_dS)NzIllegal character '%s'r�)�printr�index)r
rrrr�error6szCalcLexer.errorN)�__name__�
__module__�__qualname__�NAME�NUMBER�PLUS�TIMES�MINUS�DIVIDEZASSIGNZLPARENZRPAREN�MODZINC�tokens�ignorerrrrrrrs rc@s�eZdZejZdeefdeee	fde
ffZdd�Ze
d�dd��Ze
d�d	d��Ze
d
�dd��Ze
d�d
d��Ze
d�dd��Ze
d�dd��Ze
d�dd��Ze
d�dd��Ze
d�dd��Ze
d�dd��Ze
d�dd��Ze
d�dd��ZdS) �
CalcParser�left�rightcCs
i|_dS)N)�names)r
rrr�__init__CszCalcParser.__init__�exprcCst|j�dS)N)rr')r
�prrr�	statementFszCalcParser.statementzINC NAMEcCsBy|j|jd7<Wn$tk
r<td|j���YnXdS)NrzUndefined name )r%r�LookupErrorr)r
r(rrrr)JszNAME ASSIGN exprcCs|j|j|j<dS)N)r'r%r)r
r(rrrr)Qszexpr PLUS exprcCs|j|jS)N)�expr0�expr1)r
r(rrrr'UszCalcParser.exprzexpr MINUS exprcCs|j|jS)N)r+r,)r
r(rrrr'Yszexpr TIMES exprcCs|j|jS)N)r+r,)r
r(rrrr']szexpr DIVIDE exprcCs|j|jS)N)r+r,)r
r(rrrr'asz
expr MOD exprcCs|j|jS)N)r+r,)r
r(rrrr'eszMINUS expr %prec UMINUScCs|jS)N)r')r
r(rrrr'iszLPAREN expr RPARENcCs|jS)N)r')r
r(rrrr'msrcCs
t|j�S)N)�intr)r
r(rrrr'qsrcCs6y|j|jStk
r0td|j���dSXdS)NzUndefined name r)r%rr*r)r
r(rrrr'us
N)rrrrr rrrrrZUMINUSZ
precedencer&�_r)r'rrrrr":s"

r"�__main__zcalc > F)�sysZslyPath�path�appendZslyrrrr"rZlexerZparser�input�text�EOFError�debug�list�tokenize�xr�iterZparserrrr�<module>s*D