所以我正在使用 lark 在 python 中制作一种编程语言,当我解析输入时,例如
print("HI");
x = input("Number: ");
input
它在语句之前解析print
语句。下面是我的代码的样子。
from lark import Lark, Transformer, v_args
from lark.indenter import Indenter
grammar = '''
?start: expr
| statement* -> statement
?statement: "print" "(" expr ")" ";" -> print_statement
| "input" "(" expr ")" ";" -> input_statement
| NAME "=" "input" "(" expr ")" ";" -> var_input_statement
| NAME "=" expr ";" -> assign_var
?expr: STRING -> string
| NUMBER -> number
| NUMBER "+" NUMBER -> add
| NUMBER "-" NUMBER -> sub
| NUMBER "*" NUMBER -> mul
| NUMBER "/" NUMBER -> div
| STRING "+" STRING -> str_add
| NAME -> get_var
%import common.ESCAPED_STRING -> STRING
%import common.NUMBER
%import common.CNAME -> NAME
%declare _INDENT _DEDENT
%import common.WS_INLINE
%ignore WS_INLINE
%import common.NEWLINE -> _NL
%ignore _NL
'''
class Print():
def __init__(self, value):
self.value = value
def eval(self):
return print(self.value)
class Input():
def __init__(self, value):
self.value = value
def eval(self):
return input(self.value)
@v_args(inline=True)
class MainTransformer(Transformer):
number = int
string = str
def __init__(self):
self.vars = {}
def add(self, val1, val2):
return int(val1) + int(val2)
def sub(self, val1, val2):
return int(val1) - int(val2)
def mul(self, val1, val2):
return int(val1) * int(val2)
def div(self, val1, val2):
return int(val1) / int(val2)
def get_var(self, name):
try:
return self.vars[name]
except KeyError:
raise Exception(f"Variable {name} not found")
def assign_var(self, name, value):
if name == "print":
pass
if type(value) == str:
value = value.strip('"')
self.vars[name] = value
def var_input_statement(self, name, value):
data = self.input_statement(value, store_data=True)
self.assign_var(name, data)
def print_statement(self, value=" "):
if type(value) == str:
value = value.strip('"')
return Print(value)
def input_statement(self, value, store_data=False):
if type(value) == str:
value = value.strip('"')
if store_data == True:
data = input(value)
return data
else:
return Input(value)
def statement(self, *values):
for value in values:
if value == None:
pass
else:
value.eval()
class MainIndenter(Indenter):
NL_type = '_NL'
OPEN_PAREN_types = ['LPAR', 'LBRACE']
CLOSE_PAREN_types = ['RPAR', 'RBRACE']
INDENT_TYPE = '_INDENT'
DEDENT_type = '_DEDENT'
tab_len = 8
parser = Lark(grammar, parser='lalr',
transformer=MainTransformer(), postlex=MainIndenter())
main_parser = parser.parse
data_input = '''
print("HI");
x = input("Number: ");
'''
if __name__ == '__main__':
main_parser(data_input)
这有点像我的代码的要点,我不知道为什么我的解析器没有按顺序解析。帮助将不胜感激,谢谢!