我使用 ANTLR 4.4 和 Python3 作为目标语言。您可以在此页面中看到: https: //github.com/antlr/antlr4/releases ANTLR 4.4 支持 Python3,但是当我想使用以下命令创建 Python 词法分析器和解析器时: -Dlanguage=Python3 MyGrammar.g4 ,我得到了这个错误:
ANTLR cannot generate python3 code as of version 4.4
Run Code Online (Sandbox Code Playgroud)
我不知道这是因为我的语法,我必须修改它才能解决这个错误,或者什么?(顺便说一句,我在 ANTLRWorks 2.1 中没有错误)任何帮助将不胜感激。
我正在尝试编写一个语法来评估可能会或可能不会被括号包围的方程。前任 -
在我的规则中,我有
clause
: expression EOF
;
expression
:
LPAREN expression RPAREN #parenExpression
| isNumeric #isNumericExpression
| leftSide IS NOT? NULL #nullExpression
| compare #comparatorExpression
| NOT #notExpression
;
compare : NOT? LPAREN? NOT? leftSide op=comparator rightSide RPAREN? ;
Run Code Online (Sandbox Code Playgroud)
现在,这有几个问题。
任何有关如何为这些规则编写语法的帮助都会非常有帮助。
提前致谢!
我目前正在尝试实现一个 ruby 编译器。为了创建解析器和词法分析器,我使用了 Antlr4。现在我无法弄清楚如何在解析器中实现语义分析。有人可以解释如何使用生成的解析器进行语义分析吗?如果你能用一个简单的例子解释一下,说如何检查变量是否是,那就更好了使用前初始化。
我正在尝试从ANTLR开始。当我导入模块时antlr它工作得很好,但是如果我尝试导入MyGrammarLexer和MyGrammarParser,它表明 MyGrammarLexer 和 Parser 不在 lib 中。我使用 PyCharm ,安装了 ANTLR: pip3 install antlr4-python3-runtime我的代码是:
import sys
from antlr4 import *
import MyGrammarLexer
import MyGrammarParser
def main(argv):
input = FileStream(argv[1])
lexer = MyGrammarLexer(input)
stream = CommonTokenStream(lexer)
parser = MyGrammarParser(stream)
tree = parser.startRule()
if __name__ == '__main__':
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
也许谁知道为什么我无法导入 MyGrammarLexer 和 MyGrammarParser?请建议!反击:
/usr/bin/python3.6 /home/andrejka/PycharmProjects/Parser/parser.py
Traceback (most recent call last):
File "/home/andrejka/PycharmProjects/Parser/parser.py", line 2, in <module>
from antlr4 import *
File "/usr/lib/python3/dist-packages/antlr4/__init__.py", line 5, in <module> …Run Code Online (Sandbox Code Playgroud) getText() 返回完整的语句,不包括单词之间的空格。考虑空格的一种方法是将它们包含在语法中。但是,有没有其他方法可以获取考虑空格的完整字符串。
我在Python中使用antlr4来读取以下语法:
https://github.com/antlr/grammars-v4/tree/master/plsql
文件 grants.sql 只有“begin select 'bob' from Dual; end;”
打印像树一样的 Lisp 的简单代码
from antlr4 import *
from PlSqlLexer import PlSqlLexer
from PlSqlParser import PlSqlParser
from PlSqlParserListener import PlSqlParserListener
input = FileStream('grants.sql')
lexer = PlSqlLexer(input)
stream = CommonTokenStream(lexer)
parser = PlSqlParser(stream)
tree = parser.sql_script()
print ("Tree " + tree.toStringTree(recog=parser));
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
Tree (sql_script (unit_statement (anonymous_block BEGIN) (seq_of_statements (语句) (sql_statement (data_manipulation_language_statements (select_statement)) (子查询 (subquery_basic_elements (query_block SELECT (selected_element (select_list_elements (selected_element (select_list_elements (atom)常量 (quoted_string 'bob')))))))))))))) (from_clause FROM (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier …
我正在尝试构建以下存储库中可用的 Antlr V4 语法: https: //github.com/antlr/grammars-v4。我已经成功构建了 Python3 和 Java 语法,并且目标 *.java 文件已成功生成。但是,当我尝试构建 C# 语法(例如 CSharpLexer.g4、CSharpParser.g4 和 CsharpPreporcessorParser.g4)时,我收到构建错误。它会生成以下错误:
error(114): CSharpPreprocessorParser.g4:7:21: cannot find tokens file ./CSharpLexer.tokens
error(126): CSharpParser.g4:20:62: cannot create implicit token for string literal in non-combined grammar: '.'
error(126): CSharpParser.g4:25:14: cannot create implicit token for string literal in non-combined grammar: '?'
error(126): CSharpParser.g4:25:37: cannot create implicit token for string literal in non-combined grammar: '*'
error(126): CSharpParser.g4:31:8: cannot create implicit token for string literal in non-combined grammar: '*'
error(126): CSharpParser.g4:71:3: cannot …Run Code Online (Sandbox Code Playgroud) 我定义了一个 ANTLR4 语法,其中词法分析器和解析器位于两个不同的文件中。它是一种类似于 XML 的语法。在我的解析器中,我也想定义一个可以重复使用自身用于计算目的的表达式(如“(1+1)*2”)。
parser grammar TestExpressionParser;
options { tokenVocab=TestExpressionLexer; }
compileUnit : calculator ;
calculator : '<' 'calculator' '>' tiers? rules?'</' 'calculator' '>' ;
// tiers
tiers : '<' 'tiers' '>' tier* '</' 'tiers' '>' ;
tier : '<' 'tier' attrReference '>' '</' 'tier' '>' ;
// rules
rules : '<' 'rules' '>' (rule) '</' 'rules' '>' ;
rule : '<' 'rule' '>' (calculation|reference|description)* '</' 'rule' '>' ;
calculation : '<' 'calculation' '>' expression '</' 'calculation' '>' ; …Run Code Online (Sandbox Code Playgroud) 我正在尝试让antlr在VS中工作。我\xe2\x80\x99已经很长时间没有接触VS了。我已经根据 Antlr 在线文档添加了 AntlrVSIX 扩展,这为我创建了一个示例计算器项目,但我无法编译它(我卸载并重新安装了 AntlrVSIX,但它对以下问题没有影响)。
\nVS 抱怨 \xe2\x80\x9c 找不到类型或命名空间名称“Antlr4”(您是否缺少 using 指令或程序集引用?)\xe2\x80\x9d 并指向行 \xe2\x80\x9cusing Antlr4 .Runtime.Misc;\xe2\x80\x9d(以及更多类似的内容)。
\n如果我查看菜单“工具:NuGet Package Manager:管理 Solution\xe2\x80\xa6 的 NuGetPackages”,它会清楚地显示 Antlr4.Runtime.Standard 存在并已安装(显示版本 4.8.0)。
\n我想我必须在我的项目中添加对此 dll 的引用,因此我在解决方案资源管理器中右键单击“引用:添加引用...”,但我无法在任何列表中找到它,但我进行了搜索。
\n有一个浏览按钮,我认为我可以使用它直接链接到 DLL,因此我\xe2\x80\x99 搜索了磁盘,找到了 dll 并链接到了它。现在,所有这些错误都会消失,但这可能是\xe2\x80\x99t 可能是正确的方法。
\n那么如何使用 References:Add Reference... 正确添加对它的引用?VS 知道它\xe2\x80\x99s 在那里,它显示它,但\xe2\x80\x99t 不会让它像那样被引用,因为它不会\xe2\x80\x99t 通过引用在VS 中显示它:添加引用...
\n我正在尝试将 antlr 项目从 c++ 迁移到 go。语法和代码生成大部分已完成(基于65038949中提供的解决方案),但有一个悬而未决的项目是在 go 中编写自定义错误报告器。
我正在寻找一个用于以下目的的自定义错误报告器:
我想打印我的自定义消息,可能带有额外信息(例如文件名,默认错误打印机不会打印该消息)。
对于每个错误,错误报告器都会更新全局计数器,并且在主程序中,如果此 error_count>0,则跳过进一步的处理。
这是 c++ 项目中所做的事情:
在此函数中定义了自定义消息:
string MyErrorMessage(unsigned int l, unsigned int p, string m) {
stringstream s;
s << "ERR: line " << l << "::" << p << " " << m;
global->errors++;
return s.str();
}
Run Code Online (Sandbox Code Playgroud)
并且antlr运行时(ConsoleErrorListener.cpp)已更新以调用上述函数:
void ConsoleErrorListener::syntaxError(IRecognizer *, Token * ,
size_t line, size_t charPositionInLine, const std::string &msg, std::exception_ptr) {
std::cerr << MyErrorMessage(line, charPositionInLine, msg) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
最后,主程序将跳过进一步的处理,如下所示:
parser.top_rule();
if(global->errors > …Run Code Online (Sandbox Code Playgroud)