我对 ANTLR 中的 @members 规则有疑问。我想覆盖默认的错误处理,所以我阅读了http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery并为我的语法编写了这个简单的代码:
@members {
def displayRecognitionError(self, tokenNames, e):
print 'Test'
}
Run Code Online (Sandbox Code Playgroud)
我的语法中没有 @lexer::members 或 @parser::members 。此规则中的代码(python 运行时)仅包含在解析器文件中,而不包含在词法分析器中。这是一个错误?我认为是的,@members 应该根据文档向词法分析器和解析器添加内容。我使用 Python 运行时 3.1.3。
顺便提一句。stackoverflow 内联代码是否适用于 Opera?
例如,假设我想用单个标记元素 double star 解析大部分非结构化文本**。这是我的 ANTLR 语法:
text : (plain | tag)+ ;
plain : ~(TAG) ;
tag : TAG tag_inner TAG ;
tag_inner : ~(TAG) ;
TAG : '**' ;
TEXT : ('a'..'z' | ' ' | '.')+ ;
Run Code Online (Sandbox Code Playgroud)
如果我解析的文本在语法上是正确的,那么这个语法就可以正常工作,也就是说,每个开头**都有一个结尾**。如果有奇数个**s,则 ANTLR 会抱怨并出错。
如何解决这个问题,以便 ANTLR 会提前寻找关闭的双星,如果没有人将那颗孤独的双星视为纯文本?我很确定 ANTLR 可以做到这一点,并且句法/语义谓词就是答案,但是在我们花了大量时间阅读文档之后,我仍然无法解决。
我正在尝试使用 ANTLR 编译程序,我使用 Java 编程语言作为目标,问题的核心是开发 Intent Regornizer 以纠正错误并改进源代码,如果源代码不符合语法。在关于 ANTLR 的教程和书籍中,我看到了如何编译一个简单的代码,假设我已经制作了词法分析器和解析器以及像这样的源代码:
int main(){
int a,b;
c=20;
}
Run Code Online (Sandbox Code Playgroud)
程序如何检测变量“C”之前未知已声明的错误?
我尝试按照有关如何使用 ANTLR 进行编译的说明来应用它,但是 ANTLR 生成器的代码被认为是有效的,因为它符合表达式的语法规则。但实际上变量 c 是未知的。
或者如何制作一个可以在其中实现面向对象概念的语法?我已经尝试使用 ANTLR 语法,但结果仍然没有解释 OOP 的概念。
public class Hello {
}
public class HelloTwo {
Hello hl = new HelloWrong();
}
Run Code Online (Sandbox Code Playgroud)
如果我编译代码,结果是有效的,因为按照 Grammar.but 看那个类 HelloWrong 真的没有。它也与在我的第一个problems 上写入前一个变量有关。
对不起我的英语。我希望你能帮助我的问题。谢谢你
我有一个令牌 OR:'OR'; 我用于评估布尔表达式(a==b OR a==c)我有另一个规则来解析字符列表AZ,AK,OR,GA中的状态缩写......我发现的是antlr在状态列表上有错误认为 OR 应该是一个or标记而不是
stateName
: CHAR CHAR (','|EOF) ->^(STATE CHAR+)
;
Run Code Online (Sandbox Code Playgroud)
我将如何解决这种歧义?
这是我试图解析的一些规则
这是我正在使用的语法
grammar PointFieldRule;
options
{
//language = 'CSharp3';
output=AST;
ASTLabelType=CommonTree;
}
tokens{
STATE;
}
rule : ifExpression? actionExpression EOF!
;
ifExpression
:'IF'! logicalConditionExpression
;
logicalConditionExpression
: booleanAndConditionExpression ( BigOR^ booleanAndConditionExpression)*
;
booleanAndConditionExpression
: logicalCondition ( BigAND^ logicalCondition )*
;
BigAND …Run Code Online (Sandbox Code Playgroud) Antlr 的词法分析器支持 Kleene 闭包 ( *) 和正 Kleene 闭包 ( +),分别指示字符在非正/正时间出现的次数。Antlr 的词法分析器是否有一个结构来支持某个字符的一系列出现,就像正则表达式一样,比如'a' {8,16}?
我正在尝试从这里执行 ANTLRv4 示例http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4。
我已经下载antlr-4.0-complete.jar并将它放在某个目录中。
我已经创建了bat要运行的文件org.antlr.v4.Tool(antlr.bat) 和org.antlr.v4.runtime.misc.TestRig(run.bat)。
工具在没有参数的情况下运行并输出一些东西,所以路径是可以的。
我创建Hello.g4了以下内容:
// Define a grammar called Hello
grammar Hello;
r : 'hello' ID ; // match keyword hello followed by an identifier
ID : [a-z]+ ; // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Run Code Online (Sandbox Code Playgroud)
同一目录中的所有内容,除了 antlr-4.0-complete.jar
然后我运行antlr4 Hello.g4并没有错误。某些文件出现在当前目录 (*.java和*.tokens) 中。没有Hello.java文件出现。
然后我运行javac Hello*.java编译。*.class …
有没有办法在 ANTLR4 中表达这一点:
任何不包含星号后紧跟正斜杠的字符串?
这不起作用:(~'*/')*因为 ANTRL 引发此错误:multi-character literals are not allowed in lexer sets: '*/'
这有效但不正确:(~[*/])*因为它禁止包含单个字符*或/.
似乎ANTLR支持C#语言,但我不知道如何生成相关的类.
我搜索并看到存在Visual Studio的扩展,但我不支持2015
那么如何使用ANTLR手动为C#生成Lexer和Parser?
我有以下依赖项build.gradle:
dependencies {
compile 'org.antlr:antlr4-runtime:4.5.1'
compile 'org.slf4j:slf4j-api:1.7.12'
antlr "org.antlr:antlr4:4.5.1"
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
testCompile 'org.codehaus.groovy:groovy-all:2.4.4'
testCompile 'cglib:cglib-nodep:3.1'
testCompile 'org.objenesis:objenesis:2.1'
}
Run Code Online (Sandbox Code Playgroud)
当我使用Maven Publishing插件发布我的库时,它包括ANTLR运行时和编译时JAR作为生成的POM中的依赖项:
<dependencies>
<dependency> <!-- runtime artifact -->
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.5.1</version>
<scope>runtime</scope>
</dependency>
<dependency> <!-- compile time artifact, should not be included -->
<groupId>org.antlr</groupId>
<artifactId>antlr4</artifactId>
<version>4.5.1</version>
<scope>runtime</scope>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
我只希望运行时库包含在这个POM中.
罪魁祸首是antlr依赖:如果删除此行,生成的POM不具有编译时依赖性.但是,构建失败.
在研究用于 Java 解析的 Antlr 3.5 语法时,注意到“ IDENTIFIER ”规则在 ANTLR 词法分析器语法中消耗了很少的关键字。词法分析器语法是
lexer grammar JavaLexer;
options {
//k=8;
language=Java;
filter=true;
//backtrack=true;
}
@lexer::header {
package java;
}
@lexer::members {
public ArrayList<String> keywordsList = new ArrayList<String>();
}
V_DECLARATION
:
( ((MODIFIERS)=>tok1=MODIFIERS WS+)? tok2=TYPE WS+ var=V_DECLARATOR WS* )
{...};
fragment
V_DECLARATOR
:
(
tok=IDENTIFIER WS* ( ',' | ';' | ASSIGN WS* V_VALUE )
)
{...};
fragment
V_VALUE
: (IDENTIFIER (DOT WS* IDENTIFIER WS* '(' | ',' | ';'))
;
MODIFIERS
:
(PUBLIC | …Run Code Online (Sandbox Code Playgroud)