标签: antlr3

如何使用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语法

我很难搞清楚^和!代表ANTLR语法术语.

grammar antlr antlrworks antlr3

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

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匹配输入

当antlr v3.1编译此规则时,我收到警告

 sentence
:
(CAPITAL_LETTERS_AND_NUMBERS | INT | ANY_WORD ) 
(
    INT
| CAPITAL_LETTERS_AND_NUMBERS
| ANY_WORD 
)*;
Run Code Online (Sandbox Code Playgroud)

警告是:

 5:2: Decision can match input such as "CAPITAL_LETTERS_AND_NUMBERS" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.
 Decision can match input such as "INT" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by …
Run Code Online (Sandbox Code Playgroud)

antlr antlr3

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

最终的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语法.查询是限制在特定字段中的搜索项列表:

field1:field2:b field3:c

那应该返回一个实体列表,其中field1匹配a,field2匹配b,依此类推.查询也可以完全不受限制:

ABC

那应该返回任何与abc匹配的字段的实体.这是ANTLR语法:

@members {
  String unrestrictedQuery;
}

FIELD1_OPERATOR: 'field1:';
FIELD2_OPERATOR: 'field2:';
FIELD3_OPERATOR: 'field3:';
DIGIT: '0'..'9';
LETTER: 'A'..'Z' | 'a'..'z';

query: subquery (' ' subquery)*
  | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;}
  ;
Run Code Online (Sandbox Code Playgroud)

我希望不受限制的查询是与查询规则的第一个替代方案不匹配的任何文本.

1)有没有更好的方法来获取第二个备选方案匹配的文本?

2)当我将其插入我的Web服务器时,unrestrictedQuery解析器字段解析为查询的最后一个字符.当我真正想要整个字符串时,似乎为查询的每个字符调用了该操作.

谢谢阅读!

java parsing antlr3

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

错误:无法找到或加载主类 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
查看次数