Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Lark解析器在if/else语句之后计算print语句时引发错误_Python_Python 3.x_Lark Parser - Fatal编程技术网

Python Lark解析器在if/else语句之后计算print语句时引发错误

Python Lark解析器在if/else语句之后计算print语句时引发错误,python,python-3.x,lark-parser,Python,Python 3.x,Lark Parser,因此,我正在使用python和用于解析的lark库制作一种编程语言。当我分析以下内容时 if 5 == 4 { print("TRUE"); } else { print("FALSE"); } print("Done!"); 它会引发以下错误 PS E:\ParserAndLexer>&C:/Python38/python.exe E:/ParserAndLexer/lite/lite\u transformer.p

因此,我正在使用python和用于解析的
lark
库制作一种编程语言。当我分析以下内容时

if 5 == 4 {
    print("TRUE");
}
else {
    print("FALSE");
}
print("Done!");
它会引发以下错误

PS E:\ParserAndLexer>&C:/Python38/python.exe E:/ParserAndLexer/lite/lite\u transformer.py
回溯(最近一次呼叫最后一次):
文件“C:\Python38\lib\site packages\lark\lexer.py”,第416行,在lex中
对于l.lex中的x(stream、self.root\u lexer.newline\u类型、self.root\u lexer.ignore\u类型):
文件“C:\Python38\lib\site packages\lark\lexer.py”,第200行,在lex中
引发意外字符(流、行字符、行字符、行列、行字符、列、允许=允许、状态=自状态、令牌历史=最后一个令牌和[最后一个令牌])
lark.exceptions.unexpected字符:第7行第1列没有为“p”定义终端
打印(“HI”);
^
应为:{'IF'}
以前的令牌:令牌('RBRACE','}')
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“e:/ParserAndLexer/lite/lite_transformer.py”,第80行,in
tree=parser.parse(lite_代码)
文件“C:\Python38\lib\site packages\lark\lark.py”,第464行,在parse中
返回self.parser.parse(text,start=start)
文件“C:\Python38\lib\site packages\lark\parser\u frontends.py”,第148行,在parse中
返回self.\u parse(令牌\u流、开始、设置\u解析器\u状态)
文件“C:\Python38\lib\site packages\lark\parser\u frontends.py”,第63行,in\u parse
返回self.parser.parse(输入,开始,*args)
文件“C:\Python38\lib\site packages\lark\parsers\lalr\u parser.py”,第35行,在parse中
返回self.parser.parse(*args)
文件“C:\Python38\lib\site packages\lark\parsers\lalr\u parser.py”,第86行,在parse中
对于流中的令牌:
文件“C:\Python38\lib\site packages\lark\indenter.py”,第32行,在进程中
对于流中的令牌:
文件“C:\Python38\lib\site packages\lark\lexer.py”,第431行,在lex中
未预料到的上升(t,e.允许,状态=e.状态)
lark.exceptions.UnexpectedToken:第7行第1列的意外标记('NAME','print')。
预期会出现以下情况之一:
*如果
我不明白为什么会发生这种情况,我的代码是这样的:

来自lark进口lark、Transformer、v_args
来自lark.压头进口压头
主压头等级(压头):
NL_类型=“_NL”
OPEN\u PAREN\u types=['LPAR','LBRACE']
关闭参数类型=['RPAR','RBRACE']
缩进类型=“\u缩进”
DEDENT\u type='\u DEDENT'
tab_len=8
@v_参数(内联=真)
主变压器(变压器)等级:
定义初始化(自):
...
def编号(自身、数值):
返回整数(值)
def字符串(自身,值):
value=str(value).strip(“”)
返回字符串(值)
def分区(自身、val1、val2):
返回分区(val1、val2)
def print_语句(自身、值):
返回打印(值)
def if_语句(self、expr1、expr2、eval_expr):
返回If(expr1、expr2、eval_expr)
def if_else_语句(self、expr1、expr2、eval_expr、else_语句):
返回If(expr1、expr2、eval\u expr、else\u语句)
def if_语句(self,*值):
对于值中的值:
value.eval()
def语句(自身,*值):
对于值中的值:
value.eval()
语法='''
?开始:expr*
|语句*->语句
|if*->if_语句
如果:“如果”expr“==”expr“{”语句+“}”->if_语句
|if“expr”==“expr”{“expr+”}->if_语句
|if“expr”==“expr”{“statement+”}“else”{“statement+”}“->if\else\u语句
?声明:“打印”(“expr”);“->print_语句
|“输入”(“expr”)”;“->input_语句
|名称“=”expr“;“->分配变量
|名称“=”输入“(”表达式“)”;“->var\u input\u语句
?表达式:字符串->字符串
|编号->编号
|名称->获取变量
%导入common.escape\u字符串->字符串
%导入通用编号
%导入common.CNAME->NAME
%声明缩进
%导入common.WS_内联
%忽略WS_内联
%导入common.NEWLINE->\u NL
%忽略
'''
类Print():
定义初始值(自身,值):
自我价值=价值
def eval(自我):
返回打印(self.value.eval())
类输入():
定义初始值(自身,值):
自我价值=价值
def eval(自我):
返回输入(self.value.eval())
类字符串():
定义初始值(自身,值):
self.value=str(value).strip(“”)
def eval(自我):
回归自我价值
类整数():
定义初始值(自身,值):
self.value=int(值)
def eval(自我):
回归自我价值
类If():
def_uuuinit_uuuu(self、expr1、expr2、eval_expr、else_语句=None):
self.expr1=expr1
self.expr2=expr2
self.eval\u expr=eval\u expr
self.else\u语句=else\u语句
def eval(自我):
如果self.expr1.eval()==self.expr2.eval():
返回self.eval_expr.eval()
其他:
如果self.else_语句==无:
返回
其他:
返回self.else_语句.eval()
parser=Lark(语法,parser='lalr',postlex=maindenter())
测试输入=“”
如果5==5{
打印(“真实”);
}
否则{
印刷品(“假”);
}
打印(“完成”);
'''
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tree=parser.parse(测试输入)
打印(MainTransformer().transform(树))

我不熟悉百灵鸟,但这看起来不对:

?开始:expr*
|语句*->语句
|if*->if_语句
上面说的是“将开始规则扩展到零或多个
expr
s,零或多个
语句
s,或零或多个
if
s。”。这意味着您的语法不支持在试图解析的源字符串中混合这三种结果。如果以
If
开头,程序的其余部分必须全部是
If
s,因此