标签: antlr3

在ANTLR BNF语法符号中,epsilon的等价物是什么?

在利用ANTLR 3.3时,我正在改变当前语法以支持没有括号的输入.这是我的语法的第一个版本:

grammar PropLogic;

        NOT : '!' ;
        OR  : '+' ;
        AND : '.' ;
        IMPLIES : '->' ;
        SYMBOLS : ('a'..'z') | '~' ;
        OP : '(' ;
        CP : ')' ;

    prog    : formula EOF ;


    formula : NOT formula
        | OP formula( AND formula CP | OR formula CP | IMPLIES formula CP)
        | SYMBOLS ;


    WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;
Run Code Online (Sandbox Code Playgroud)

然后我改变它以支持适当的功能: …

java validation antlr antlr3

6
推荐指数
1
解决办法
8275
查看次数

如何使用ANTLR修改CommonTokenStream中的标记文本?

我正在尝试学习ANTLR,同时将它用于当前项目.

我已经达到了可以在一大块代码上运行词法分析器并将其输出到CommonTokenStream的程度.这工作正常,我已经验证源文本被分解为适当的标记.

现在,我希望能够修改此流中某些标记的文本,并显示现在修改的源代码.

例如,我尝试过:

import org.antlr.runtime.*;
import java.util.*;

public class LexerTest
{
    public static final int IDENTIFIER_TYPE = 4;

    public static void main(String[] args)
    {
    String input = "public static void main(String[] args) { int myVar = 0; }";
    CharStream cs = new ANTLRStringStream(input);


        JavaLexer lexer = new JavaLexer(cs);
        CommonTokenStream tokens = new CommonTokenStream();
        tokens.setTokenSource(lexer);

        int size = tokens.size();
        for(int i = 0; i < size; i++)
        {
            Token token = (Token) tokens.get(i);
            if(token.getType() == IDENTIFIER_TYPE)
            {
                token.setText("V");
            }
        } …
Run Code Online (Sandbox Code Playgroud)

compiler-construction antlr lexical-analysis antlr3

5
推荐指数
2
解决办法
6149
查看次数

帮助解析日志文件(ANTLR3)

我需要一点指导来编写语法来解析游戏永恒之塔的日志文件.我决定使用Antlr3(因为它似乎是一个可以完成工作的工具,我认为学会使用它对我有好处).但是,由于日志文件的结构不完整,我遇到了问题.

我需要解析的日志文件如下所示:

2010.04.27 22:32:22 : You changed the connection status to Online. 
2010.04.27 22:32:22 : You changed the group to the Solo state. 
2010.04.27 22:32:22 : You changed the group to the Solo state. 
2010.04.27 22:32:28 : Legion Message: www.xxxxxxxx.com (forum)



ventrillo: 19x.xxx.xxx.xxx

Port: 3712

Pass: xxxx (blabla) 

 4/27/2010 7:47 PM 
2010.04.27 22:32:28 : You have item(s) left to settle in the sales agency window.
Run Code Online (Sandbox Code Playgroud)

如您所见,大多数行以时间戳开头,但也有例外.我想在Antlr3中做的是编写一个解析器,它只使用以时间戳开头的行,同时静默地丢弃其他行.

这就是我到目前为止所写的内容(我是这些东西的初学者所以请不要笑:D)

grammar Antlr;

options {
  language = Java;
}

logfile: line* EOF;

line : …
Run Code Online (Sandbox Code Playgroud)

parsing antlr text-parsing antlr3

5
推荐指数
1
解决办法
1637
查看次数

如何在 Antlr 分词器中进行 Unicode 转义解码

我使用 AntlrWorks 创建了一个 antlr 语法,并创建了一个供内部使用的本地化工具。我想在解析时将 unicode 转义序列转换为实际的 Java 字符,但不确定执行此操作的最佳方法。这是我的语法中的标记定义。是否有某种方法可以为片段 UNICODE_ESC 指定一个操作,该操作将返回字符,而不是六个字符转义序列?

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    : …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr3

5
推荐指数
1
解决办法
863
查看次数

ANTLR3词法分析器优先

我想'..'在ANTLR3词法分析器中创建一个令牌,用于将表达式串起来

a..b     // [1]
c .. x   // [2]
1..2     // [3] 
3 .. 4   // [4]
Run Code Online (Sandbox Code Playgroud)

所以,我补充说,

DOTDOTSEP : '..' 
          ;
Run Code Online (Sandbox Code Playgroud)

问题是我已经有了一条规则:

FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f'))
      ;
Run Code Online (Sandbox Code Playgroud)

并且在上面的示例[3] 1..2中得到匹配FLOAT(我不知道为什么因为第一个.是另一个.不是INT,但它是).

我想知道是否有办法改变词法分析器规则的优先级,因此DOTDOTSEP首先匹配FLOAT.

这里,似乎我失去了出来,"The rule having the greatest count is the winner.",但不知道是否有办法解决它.

PS INT定义如下......

fragment DIGIT
    : '0'..'9'
    ;

INT : DIGIT+
    ;
Run Code Online (Sandbox Code Playgroud)

编辑. 进一步的测试让我觉得它不像直接匹配FLOAT规则那么简单.(我打算改变这个问题,但既然我现在得到了答案,我就不会.)问题(我相信)仍然存在于词法分析规则的优先级,所以问题仍然是一样的.

antlr lexer antlr3

5
推荐指数
1
解决办法
1183
查看次数

最终的ANTLR参考 - 第一个程序不起作用

我最近购买了The Definitive ANTLR Reference,我很高兴开始使用ANTLR.
在第一章中,显示了这个语法:

grammar T;

options {
    language = Java;
}

r : 'call' ID ';' {System.out.println("invoke " + $ID.text);} ;
ID : 'a'..'z'+ ;
WS : (' '|'\n'|'\r')+   {$channel=HIDDEN;} ;
Run Code Online (Sandbox Code Playgroud)

我将这个语法复制到一个文件(.g扩展名)中,生成了Lexer和Parser,并创建了一个主类,如下所示:

import org.antlr.runtime.*;

public final class Test {
    public static void main(String[] args) throws Exception {
        ANTLRInputStream input = new ANTLRInputStream(System.in);
        TLexer lexer = new TLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);

        parser.r();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有真正的错误,但是当我运行主类并输入:

call foo;
Run Code Online (Sandbox Code Playgroud)

什么都没发生.应该将"invoke foo"输出到屏幕,但没有任何反应.我不想在没有完成任何练习的情况下继续读书.如果重要的话,我在Eclipse中使用ANTLR 3.4.很抱歉,这似乎是一个简单的问题,但我是ANTLR的新手. …

antlr antlr3

5
推荐指数
1
解决办法
378
查看次数

如何删除左递归

我想制作一个允许curried函数调用的语法.

那是:

a() /// good
a()() /// good
a()()() /// good
a(a) /// good
a(a()()) /// good
/// etc
Run Code Online (Sandbox Code Playgroud)

我的第一个刺是这样的:

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

fncall  :   expr '(' (expr (',' expr)*)? ')';

expr    :   ID|fncall;
Run Code Online (Sandbox Code Playgroud)

但由于左递归而失败.

recursion antlr antlr3 left-recursion

5
推荐指数
1
解决办法
299
查看次数

如何在Clojure中使用尾递归来运行AST

我有一个ANTLR3 AST,我需要遍历一个后序,深度优先遍历,我已经实现了大致如下的Clojure:

(defn walk-tree [^CommonTree node]
  (if (zero? (.getChildCount node))
    (read-string (.getText node))
    (execute-node
      (map-action node)
      (map walk-tree (.getChildren node)))))))
Run Code Online (Sandbox Code Playgroud)

我想使用循环... recur将其转换为尾递归,但我无法弄清楚如何有效地使用显式堆栈来执行此操作,因为我需要进行后序遍历.

antlr functional-programming tail-recursion clojure antlr3

5
推荐指数
2
解决办法
1398
查看次数

ANTLR for Lucene 中的查询解析

可能它会结合几个问题,但上下文是相同的。

背景:我需要为 Lucene 实现自定义查询解析。原因是我不将某些字段存储在 Lucene 中,而是将它们保存在单独的数据库中,因为它们更改得太频繁。该字段为分类类别,即

所以,我想像这样解析查询:

(猫:重要和你好)或(猫:不重要和你好)

是否有类似 Lucene 的语言的标准 ANTLR4 查询解析器(或示例)?有没有一种方法可以引入自定义 QueryNode,而不需要我从头开始重写所有内容(Sytax、QueryBuilders 等)?

非常感谢大家!!!

java lucene antlr antlr3

5
推荐指数
1
解决办法
1728
查看次数

错误:无法找到或加载主类 org.antlr.Tool

我是 Java 和 ANTLR 的初学者。我正在尝试在 Netbeans IDE 中使用 ANTLR。我试图运行一个示例示例,并且确实遵循了所需的所有重要步骤,例如设置环境变量,包括 jar 文件和修改 built.xml。

但是当我尝试清理和构建我的应用程序时,我收到以下错误:

Error: Could not find or load main class org.antlr.Tool

Java Result: 1
Created dir: ../NetBeansProjects/AntlrTestApp/build/empty
Created dir: ../NetBeansProjects/AntlrTestApp/build/generated-sources/ap-source-output

Compiling 1 source file to ../NetBeansProjects/AntlrTestApp/build/classes
../NetBeansProjects/AntlrTestApp/src/antlrtestapp/AntlrTestApp.java:24: error: cannot find symbol
    grammarLexer lexer = new grammarLexer(input);
  symbol:   class grammarLexer
  location: class AntlrTestApp

../NetBeansProjects/AntlrTestApp/src/antlrtestapp/AntlrTestApp.java:24: error: cannot find symbol
    grammarLexer lexer = new grammarLexer(input);
  symbol:   class grammarLexer
  location: class AntlrTestApp

../NetBeansProjects/AntlrTestApp/src/antlrtestapp/AntlrTestApp.java:26: error: cannot find symbol
    grammarParser parser = new grammarParser(tokens);
  symbol: …
Run Code Online (Sandbox Code Playgroud)

java build antlr3 netbeans-7 ubuntu-12.04

5
推荐指数
1
解决办法
5936
查看次数