cometi muitos crimes principalmente gramaticais #commie

This commit is contained in:
Tiago Sousa 2023-05-27 23:45:25 +01:00
parent e3a0ea5bf1
commit 98d359e7fe
3 changed files with 59 additions and 13 deletions

View file

@ -90,5 +90,3 @@ smooth = false
points = [ { x = 1, y = 2, z = 3 }, points = [ { x = 1, y = 2, z = 3 },
{ x = 7, y = 8, z = 9 }, { x = 7, y = 8, z = 9 },
{ x = 2, y = 4, z = 8 } ] { x = 2, y = 4, z = 8 } ]

View file

@ -1,6 +1,8 @@
from ply import lex from ply import lex
tokens = [ tokens = [
"TABLE",
"ARRTABLE",
"ID", "ID",
"STR", "STR",
"MLSTR", "MLSTR",
@ -19,10 +21,51 @@ tokens = [
"NEWLINE", "NEWLINE",
] ]
def t_NEWLINE(t): states = (('array','inclusive'),
('dict','inclusive'))
def t_TABLE(t):
r"\[\s*(([\w_-]+|\"[\w_-]+\"|\'[\w_-]+\')(\s*\.\s*([\w_-]+|\"[\w_-]+\"|\'[\w_-]+\'))*)\s*\]"
header = t.lexer.lexmatch.groups()[1]
header = [s.strip(" \"\'") for s in header.split('.')]
t.value = header
return t
def t_ARRTABLE(t):
r"\[\s*\[\s*(([\w_-]+|\"[\w_-]+\"|\'[\w_-]+\')(\s*\.\s*([\w_-]+|\"[\w_-]+\"|\'[\w_-]+\'))*)\s*\]\s*\]"
header = t.lexer.lexmatch.groups()[6]
header = [s.strip(" \"\'") for s in header.split('.')]
t.value = header
return t
def t_INITIAL_NEWLINE(t):
r"\n+\s*" r"\n+\s*"
return t return t
def t_INITIAL_open_array(t):
r"\["
t.type = "["
t.lexer.push_state('array')
return t
def t_array_close_array(t):
r"\]"
t.type = "]"
t.lexer.pop_state()
return t
def t_INITIAL_open_dict(t):
r"\{"
t.type = "{"
t.lexer.push_state('dict')
return t
def t_dict_close_dict(t):
r"\}"
t.type = "}"
t.lexer.pop_state()
return t
# needs to check if datetime is valid # needs to check if datetime is valid
def t_DATETIME(t): def t_DATETIME(t):
r"\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d{1,6})?(Z|[+-]\d{2}:\d{2})" r"\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d{1,6})?(Z|[+-]\d{2}:\d{2})"
@ -120,7 +163,8 @@ def t_error(t):
t_ignore = "\t " t_ignore = "\t "
t_array_dict_ignore = "\t\n "
literals = "[]{},=" literals = ",="
lexer = lex.lex() lexer = lex.lex()

View file

@ -4,7 +4,8 @@ import json
def p_toml(p): def p_toml(p):
"""toml : content""" """toml : newlines content
| content"""
def p_content_multi(p): def p_content_multi(p):
@ -16,19 +17,22 @@ def p_content_single(p):
def p_tomlEntries_table(p): def p_tomlEntries_table(p):
"""tomlEntries : table NEWLINE""" """tomlEntries : table newlines"""
def p_tomlEntries_object(p): def p_tomlEntries_object(p):
"""tomlEntries : object NEWLINE""" """tomlEntries : object newlines"""
def p_newlines(p):
"""newlines : newlines NEWLINE
| NEWLINE"""
def p_table_simple(p): def p_table_simple(p):
"""table : '[' ID ']'""" """table : TABLE"""
p.parser.current_inline_tables = [] p.parser.current_inline_tables = []
p.parser.current_tables = [] p.parser.current_tables = []
p.parser.syntax_error = False p.parser.syntax_error = False
headers = p[2] headers = p[1]
temp = p.parser.root_dict temp = p.parser.root_dict
for header in headers[:-1]: for header in headers[:-1]:
if header not in temp: if header not in temp:
@ -45,16 +49,16 @@ def p_table_simple(p):
print("Cannot define the same table twice") print("Cannot define the same table twice")
p.parser.syntax_error = True p.parser.syntax_error = True
p.parser.current_header = temp p.parser.current_header = temp
p.parser.current_header_name = p[2] p.parser.current_header_name = p[1]
# isto ta errado # isto ta errado
def p_table_array(p): def p_table_array(p):
"""table : '[' '[' ID ']' ']'""" """table : ARRTABLE"""
p.parser.current_inline_tables = [] p.parser.current_inline_tables = []
p.parser.current_tables = [] p.parser.current_tables = []
p.parser.syntax_error = False p.parser.syntax_error = False
headers = p[3] headers = p[1]
temp = p.parser.root_dict temp = p.parser.root_dict
for header in headers[:-1]: for header in headers[:-1]:
if header not in temp: if header not in temp:
@ -69,7 +73,7 @@ def p_table_array(p):
temp[headers[-1]].append({}) temp[headers[-1]].append({})
temp = temp[headers[-1]][-1] temp = temp[headers[-1]][-1]
p.parser.current_header = temp p.parser.current_header = temp
p.parser.current_header_name = p[3] p.parser.current_header_name = p[1]
def p_object(p): def p_object(p):