103 lines
1.8 KiB
Python
103 lines
1.8 KiB
Python
|
import ply.yacc as yacc
|
||
|
|
||
|
from lexer import tokens
|
||
|
|
||
|
def p_value(p):
|
||
|
"""
|
||
|
value : BASE16
|
||
|
| BASE10
|
||
|
| STRING
|
||
|
| ATOM
|
||
|
"""
|
||
|
#print(p[0], p[1])
|
||
|
p[0] = ("value", p[1])
|
||
|
|
||
|
|
||
|
def p_attribute(p):
|
||
|
"""attribute : ATOM ATTRIB value"""
|
||
|
# print(p[0], p[1])
|
||
|
p[0] = ("attribute", p[1], p[3])
|
||
|
|
||
|
|
||
|
def p_attributes(p):
|
||
|
"""
|
||
|
attributes : attributes attribute
|
||
|
attributes : attribute
|
||
|
"""
|
||
|
if len(p) == 2:
|
||
|
p[0] = ["attributes", p[1]]
|
||
|
else:
|
||
|
p[0] = p[1]
|
||
|
p[0].append(p[2])
|
||
|
|
||
|
|
||
|
def p_section(p):
|
||
|
"""
|
||
|
section : SECTION ATOM
|
||
|
| SECTION ATOM attributes
|
||
|
"""
|
||
|
if (len(p) == 3):
|
||
|
p[0] = ("section", p[2])
|
||
|
else:
|
||
|
p[0] = ("section", p[2], p[3])
|
||
|
|
||
|
def p_values(p):
|
||
|
"""
|
||
|
values : values value
|
||
|
values : value
|
||
|
"""
|
||
|
if len(p) == 2:
|
||
|
p[0] = ["values", p[1]]
|
||
|
else:
|
||
|
p[0] = p[1]
|
||
|
p[0].append(p[2])
|
||
|
|
||
|
|
||
|
def p_element(p):
|
||
|
"""
|
||
|
element : ATOM values
|
||
|
| ATOM values attributes
|
||
|
| ATOM attributes
|
||
|
"""
|
||
|
# print(len(p))
|
||
|
p[0] = ["element", p[1], p[2]]
|
||
|
if (len(p) == 4):
|
||
|
p[0].append(p[3])
|
||
|
|
||
|
|
||
|
def p_statement(p):
|
||
|
"""
|
||
|
statement : element
|
||
|
| DEEP element
|
||
|
| section
|
||
|
"""
|
||
|
if (len(p) > 2):
|
||
|
p[0] = ('deep', p[2])
|
||
|
else:
|
||
|
p[0] = p[1]
|
||
|
|
||
|
|
||
|
def p_error(p):
|
||
|
if not p:
|
||
|
return
|
||
|
else:
|
||
|
print("Syntax error {p}")
|
||
|
|
||
|
parser = yacc.yacc(start="statement")
|
||
|
|
||
|
|
||
|
TEST_STRING = [
|
||
|
'%%% heck',
|
||
|
'%%% heck foo=bar',
|
||
|
'%%% heck bar=-5l quux="hello! how are you today?" fred=69 barney=nice',
|
||
|
'title "My website!"',
|
||
|
'zoom 5.73',
|
||
|
'tags yo fresh',
|
||
|
'dumper 1 2 3 4 5 6 7 8 9 dumpped=True',
|
||
|
'> big_dumper 32 23 384848',
|
||
|
]
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
for test in TEST_STRING:
|
||
|
print(parser.parse(test))
|