标签: antlr

ANTLR @members 和词法分析器

我对 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?

antlr

4
推荐指数
1
解决办法
5816
查看次数

使用 ANTLR 解析非结构化文本

例如,假设我想用单个标记元素 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 可以做到这一点,并且句法/语义谓词就是答案,但是在我们花了大量时间阅读文档之后,我仍然无法解决。

parsing antlr

4
推荐指数
1
解决办法
1140
查看次数

用ANTLR“需要概念”解析Java代码

我正在尝试使用 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 上写入前一个变量有关。

对不起我的英语。我希望你能帮助我的问题。谢谢你

java oop antlr

4
推荐指数
1
解决办法
1117
查看次数

解决 antlr 中的令牌冲突

我有一个令牌 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)

我将如何解决这种歧义?

这是我试图解析的一些规则

  • THEN STATE_LICENSE AL,AK,AS,AZ,AR,CT,DE,DC,FM,FL,GA,GU,HI,ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA, MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,OR,PW,PA
  • 如果 1198 == "x" 或 1190 != "x" 然后禁用 800
  • IF 801 >= "1000000" THEN DISPLAY_ERROR "It's+too+expensive.+Go+and+get+cheaper+one+!!!"

这是我正在使用的语法

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)

c# antlr antlrworks antlr3

4
推荐指数
1
解决办法
365
查看次数

Antlr 词法分析器对出现范围的支持?

Antlr 的词法分析器支持 Kleene 闭包 ( *) 和正 Kleene 闭包 ( +),分别指示字符在非正/正时间出现的次数。Antlr 的词法分析器是否有一个结构来支持某个字符的一系列出现,就像正则表达式一样,比如'a' {8,16}

antlr lexer

4
推荐指数
1
解决办法
865
查看次数

org.antlr.v4.runtime.misc.TestRig 挂起

我正在尝试从这里执行 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 …

java windows antlr

4
推荐指数
1
解决办法
965
查看次数

ANTLR4:词法分析器规则:任何字符串,只要它不包含这两个并排的字符?

有没有办法在 ANTLR4 中表达这一点:

任何不包含星号后紧跟正斜杠的字符串?

这不起作用:(~'*/')*因为 ANTRL 引发此错误:multi-character literals are not allowed in lexer sets: '*/'

这有效但不正确:(~[*/])*因为它禁止包含单个字符*/.

grammar antlr lexical-analysis lexer antlr4

4
推荐指数
1
解决办法
4745
查看次数

如何使用ANTLR获取Lexer和Parser for C#?

似乎ANTLR支持C#语言,但我不知道如何生成相关的类.

我搜索并看到存在Visual Studio的扩展,但我不支持2015

那么如何使用ANTLR手动为C#生成Lexer和Parser?

c# antlr

4
推荐指数
1
解决办法
1653
查看次数

如何从Gradle Maven Publishing插件构建的POM中排除依赖项?

我有以下依赖项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不具有编译时依赖性.但是,构建失败.

antlr gradle antlr4 build.gradle

4
推荐指数
1
解决办法
2280
查看次数

'IDENTIFIER' 规则也使用 ANTLR Lexer 语法中的关键字

在研究用于 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)

java parsing antlr tokenize antlr3

4
推荐指数
1
解决办法
1621
查看次数