Python ANTLR4 示例 - 解析器似乎无法正确解析
Python ANTLR4 example - Parser doesn't seem to parse correctly
为了演示这个问题,我将创建一个简单的语法来检测类似 Python 的变量。
我创建一个虚拟环境并安装antlr4-python3-runtime
in it, as mentioned in "Where can I get the runtime?":
然后,我创建一个包含以下内容的 PyVar.g4
文件:
grammar PyVar;
program: IDENTIFIER+;
IDENTIFIER: [a-zA-Z_][a-zA-Z0-9_]*;
NEWLINE: '\n' | '\r\n';
WHITESPACE: [ ]+ -> skip;
现在,如果我用 grun
测试语法,我可以看到语法检测到的变量很好:
现在我正在尝试在 Python 中编写一个解析器来做到这一点。我使用以下命令生成 Lexer 和 Parser:
antlr4 -Dlanguage=Python3 PyVar.g4
而且它们的生成没有错误:
但是当我使用“How do I run the generated lexer and/or parser?”中提供的示例时,我没有得到输出:
我做错了什么?
这里有两个问题。
1.语法:
在我所在的行中,
program: IDENTIFIER+;
解析器只会检测一个或多个变量,不会检测任何换行符。当 运行 grun
时您看到的输出是由词法分析器创建的输出,这就是令牌中存在换行符的原因。所以我不得不用这样的东西替换它,以便解析器检测换行符。
program: (IDENTIFIER | NEWLINE)+;
2。打印解析器
的输出
在 PyVar.py
文件中,我用这一行创建了一个树:
tree = parser.program()
但它没有打印输出,我也不知道如何打印,但是 OP's comment on this accepted answer 建议使用 tree.toStringTree()
。
现在,如果我们修复这些,我们可以看到它有效:
为了演示这个问题,我将创建一个简单的语法来检测类似 Python 的变量。
我创建一个虚拟环境并安装antlr4-python3-runtime
in it, as mentioned in "Where can I get the runtime?":
然后,我创建一个包含以下内容的 PyVar.g4
文件:
grammar PyVar;
program: IDENTIFIER+;
IDENTIFIER: [a-zA-Z_][a-zA-Z0-9_]*;
NEWLINE: '\n' | '\r\n';
WHITESPACE: [ ]+ -> skip;
现在,如果我用 grun
测试语法,我可以看到语法检测到的变量很好:
现在我正在尝试在 Python 中编写一个解析器来做到这一点。我使用以下命令生成 Lexer 和 Parser:
antlr4 -Dlanguage=Python3 PyVar.g4
而且它们的生成没有错误:
但是当我使用“How do I run the generated lexer and/or parser?”中提供的示例时,我没有得到输出:
我做错了什么?
这里有两个问题。
1.语法:
在我所在的行中,
program: IDENTIFIER+;
解析器只会检测一个或多个变量,不会检测任何换行符。当 运行 grun
时您看到的输出是由词法分析器创建的输出,这就是令牌中存在换行符的原因。所以我不得不用这样的东西替换它,以便解析器检测换行符。
program: (IDENTIFIER | NEWLINE)+;
2。打印解析器
的输出在 PyVar.py
文件中,我用这一行创建了一个树:
tree = parser.program()
但它没有打印输出,我也不知道如何打印,但是 OP's comment on this accepted answer 建议使用 tree.toStringTree()
。
现在,如果我们修复这些,我们可以看到它有效: