天儿真好!
如何构建一个简单的ANTLR语法处理多行表达式而不需要分号或反斜杠?
我正在尝试为表达式编写一个简单的DSL:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
Run Code Online (Sandbox Code Playgroud)
总的来说,我希望我的应用程序为脚本提供一些初始命名值并提取最终结果.不过,我对语法感到很沮丧.我想支持多行表达式,如下所示:
# Note: no backslashes required to continue expression, as we're in brackets
# Note: no semicolon required at end of expression, either
ThisValueWithAReallyLongName = (ThisOtherValueWithASimilarlyLongName
+AnotherValueWithAGratuitouslyLongName)
Run Code Online (Sandbox Code Playgroud)
我开始使用这样的ANTLR语法:
exprlist
: ( assignment_statement | empty_line )* EOF!
;
assignment_statement
: assignment NL!?
;
empty_line
: NL;
assignment
: ID '=' expr
;
// …Run Code Online (Sandbox Code Playgroud) 我正在清理我的一个旧项目,它计算了一些关于大型软件项目的简单指标.其中一个指标是文件/类/方法的长度.目前我的代码"猜测"类/方法边界基于一个非常粗略的算法(遍历文件,保持"当前深度"并在遇到不带引号的括号时调整它;当你返回到关卡时,类或方法开始于,考虑退出).但是,这个过程存在许多问题,并且检测深度变化的"简单"方法并不总是有效.
为了使这个结果准确,我需要使用检测函数定义,类定义和深度变化的规范方法(在每种语言中).这相当于编写一个简单的解析器来生成解析树,该解析树至少包含我希望项目适用的每种语言的这些元素.
显然之前已经为所有这些语言编写了解析器,所以看起来我不应该重复这种努力(即使编写解析器很有趣). 是否有一些开源项目为一堆源语言收集即用型解析器库?或者我应该只是使用ANTLR从头开始创建自己的? (注意:我很高兴将项目移植到另一种语言来使用一个很好的现有资源,所以如果你知道一个,那么写入它的语言并不重要.)
我有一个ANTLR语法,我想模糊我的解析器.
我正在研究为Apex语言编写代码格式化工具的可行性,Java上的Salesforce.com变体,以及基于标记的标记语言perhams VisualForce.
我不知道从哪里开始这个,除了感觉/知道从头开始编写语言解析器可能不是最好的方法.
我对Antlr是什么以及它做了什么有一个相当薄的把握,但从概念上讲,我想象一个人可以"训练"antlr来理解Apex的语法.然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以走,以生成格式正确的代码.
这是正确的概念吗?Antlr是一个可以做到这一点的工具吗?有关此的简要概要的任何链接?我正在寻找投资这几天的任务,而不是几个月,我不确定它是否甚至模糊地实现.
是否有可能指示ANTLR不将整个文件加载到内存中?它可以逐个应用规则并按顺序生成最顶层的节点列表以及读取文件吗?也可能以某种方式丢弃分析的节点?
我有一个Antlr语法,目前大约有1200行.它解析我想要的语言,但对于至少一个构造,即使对于较小的输入文件,它也非常慢.对于构造的每个添加元素,执行时间似乎呈指数增长.
我想知道是否有任何关于调试/分析此类性能问题的良好指导.
我已经尝试过使用VisualVM,它给出了两个方法closureCheckingStopState和closure_的名称,但这并没有更接近于弄清楚语法有什么问题.
我正在研究一个小型文本编辑器项目,并希望为几种语言添加基本的语法高亮(Java,XML ......仅举几例).作为一种学习经历,我想添加一个流行或非流行的Java词法分析器.
你推荐什么项目.Antlr可能是最知名的,但它似乎相当复杂和沉重.
这是我所知道的选项.
这应该很简单.我正在使用ANTLR编写词法分析器语法,并希望将变量标识符的最大长度限制为30个字符.我试图用这一行完成这个(遵循正常的正则表达式 - 除了''thing - 语法):
ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");}
;
Run Code Online (Sandbox Code Playgroud)
代码生成没有错误,但由于生成的代码中的一行简单而导致编译失败:
0,29
显然,antlr将括号内的文本部分与打印线一起放在接受状态区域.我搜索了ANTLR网站,但没有找到相应表达式的示例或引用.这个表达式的语法应该是什么?
我有一个定义DSL(特定于域的语言)的ANTLR语法.这个语法相对简单.它正在解析语言并输出C代码以创建一个非常基本的翻译器.
这种语言用于C#应用程序(键入某种控件,无论是RichTextBox还是自定义控件),一种要求是为此语言提供语法高亮显示.我已经浏览了互联网,希望能找到关于如何实现这一目标的某种信息,或者找到一种工具来让自己变得更容易.
在没有找到太多信息之后,我最好的假设是我需要使用ANTLR生成的词法分析器来查看标记并相应地对它们进行着色.这是正确的操作路径,还是有其他方法/工具为自定义域特定语言提供语法突出显示?如果这是正确的方法,我该如何识别特定的令牌?
如果我遗漏了任何重要信息,请询问!谢谢!
注意:这是一个自我回答的问题,旨在提供有关ANTLR用户最常犯错误之一的参考.
当我测试这个非常简单的语法时:
grammar KeyValues;
keyValueList: keyValue*;
keyValue: key=IDENTIFIER '=' value=INTEGER ';';
IDENTIFIER: [A-Za-z0-9]+;
INTEGER: [0-9]+;
WS: [ \t\r\n]+ -> skip;
Run Code Online (Sandbox Code Playgroud)
通过以下输入:
foo = 42;
Run Code Online (Sandbox Code Playgroud)
我最终得到以下运行时错误:
第1行:第6行不匹配输入'42'期望INTEGER
第1行:8输入不匹配';' 期待'='
为什么不承认ANTLR 42作为INTEGER在这种情况下?
它应该匹配模式[0-9]+就好了.
如果我颠倒了定义的顺序INTEGER并且IDENTIFIER定义它似乎有效,但为什么顺序首先重要?