在利用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)
然后我改变它以支持适当的功能: …
我正在尝试学习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) 我需要一点指导来编写语法来解析游戏永恒之塔的日志文件.我决定使用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) 我使用 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) 我想'..'在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规则那么简单.(我打算改变这个问题,但既然我现在得到了答案,我就不会.)问题(我相信)仍然存在于词法分析规则的优先级,所以问题仍然是一样的.
我最近购买了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的新手. …
我想制作一个允许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)
但由于左递归而失败.
我有一个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将其转换为尾递归,但我无法弄清楚如何有效地使用显式堆栈来执行此操作,因为我需要进行后序遍历.
可能它会结合几个问题,但上下文是相同的。
背景:我需要为 Lucene 实现自定义查询解析。原因是我不将某些字段存储在 Lucene 中,而是将它们保存在单独的数据库中,因为它们更改得太频繁。该字段为分类类别,即猫
所以,我想像这样解析查询:
(猫:重要和你好)或(猫:不重要和你好)
是否有类似 Lucene 的语言的标准 ANTLR4 查询解析器(或示例)?有没有一种方法可以引入自定义 QueryNode,而不需要我从头开始重写所有内容(Sytax、QueryBuilders 等)?
非常感谢大家!!!
我是 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) antlr3 ×10
antlr ×9
java ×4
build ×1
clojure ×1
lexer ×1
lucene ×1
netbeans-7 ×1
parsing ×1
recursion ×1
text-parsing ×1
ubuntu-12.04 ×1
validation ×1