我写过这个语法:
expr : multExpr ( ('+' | '-') multExpr )*;
multExpr : atom ( ('*' | '/') atom )*;
atom : INT | FLOAT | ID | '(' expr ')';
condition : cond ('or' cond)*;
cond : c1 ('and' c1)*;
c1 : ('not')? c2;
c2 : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
Run Code Online (Sandbox Code Playgroud)
我已经省略了INT,FLOAT,ID的词法规则,因为很明显.
问题是c2规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?
我在堆栈溢出中找到了与"多个替代"相关的问题,但没有什么有用的.这是我在antlr3中的g文件的一部分.
statement:
selection_stmt
| expression_stmt
| compound_stmt
| iteration_stmt
| return_stmt
;
selection_stmt:
IF OPENB expression CLOSB statement (ELSE statement)?
;
expression:
(var ASSIGN expression) => assignment
| simple_expression
;
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我收到上述短语的警告ELSE statement.
(200):决策可以使用多个备选方案匹配输入,例如"ELSE":1,2结果,对于该输入禁用了备选方案2
谁能解释一下这里发生了什么?谢谢.
PS当我使用句法谓词时((ELSE)=>ELSE statement)?,警告消失.我也不明白这个原因.
我有语法谓词,我必须转换为 Antlr 4。语法不是我自己写的,所以我不知道如何以有意义的方式转换它们。这些是我必须转换的语法的主要变体。
1.
simpleSelector
: elementName
((esPred)=>elementSubsequent)*
| ((esPred)=>elementSubsequent)+
;
esPred
: HASH | DOT | LBRACKET | COLON
;
elementSubsequent
: HASH
| cssClass
| attrib
| pseudo
;
Run Code Online (Sandbox Code Playgroud)
2.
fragment EMS :; // 'em'
fragment EXS :; // 'ex'
fragment LENGTH :; // 'px'. 'cm', 'mm', 'in'. 'pt', 'pc'
fragment ANGLE :; // 'deg', 'rad', 'grad'
fragment TIME :; // 'ms', 's'
fragment FREQ :; // 'khz', 'hz'
fragment DIMENSION :; // nnn'Somethingnotyetinvented'
fragment PERCENTAGE :; // …Run Code Online (Sandbox Code Playgroud) 我尝试使用build xml配置antlr和netbeans,我遵循http://wiki.netbeans.org/AntlrInNetBeansJavaApplication 教程,但是当我清理并构建项目时,我得到一个错误,如
错误:无法找到或加载主类org.antlr.Tool
我设置了类路径:SET CLASSPATH =.; c:\ Users\BayDebrecen\Downloads\antlr-4.2.2-complete.jar;%CLASSPATH%
我的构建xml:
<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)
构建,测试和运行项目MyAntlrProject.
<target name="-pre-compile" depends="antlr">
</target>
<target name="init-antlr">
<!-- Full path to Antlr jar -->
<property name="antlr.jar" location="c:\\Users\\BayDebrecen\\Downloads\\antlr-4.2-complete.jar"/>
<!-- Grammar path -->
<property name="antlr.grammar" location="src\\myantlrproject\\MyGrammar.g"/>
</target>
<target name="antlr" depends="init-antlr" unless="up-to-date">
<!-- Compiling grammar -->
<java classname="org.antlr.Tool" fork="true">
<arg value="${antlr.grammar}"/>
<classpath path="${antlr.jar}"/>
</java>
</target>
Run Code Online (Sandbox Code Playgroud)
如何正确编译和运行我生成的类?
这是我第一次与ANTLR合作在伦敦帝国理工学院开展项目,直到现在它才非常有用.我已经定义了一个简单的递归语法如下
grammar Hello;
execution: workflow;
workflow : Task
| workflow OPERATOR workflow
|'(' workflow OPERATOR workflow ')'
|'(' workflow OPERATOR workflow ')' (OPERATOR workflow)*
;
Task : 'T' ('0'..'9')+ | 'WF' ('0'..'9')+;
OPERATOR: 'AND' | 'OR' | 'XOR' |';' ;
WS : [ \t\n\r]+ -> channel(HIDDEN) ;
Run Code Online (Sandbox Code Playgroud)
评估字符串,如:
T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND T5 OR T11
Run Code Online (Sandbox Code Playgroud)
并且它完美地运行,当我尝试评估不正确的字符串时,我的问题就出现了
T6 ; (T4 AND T7) ; T5 ; ( …Run Code Online (Sandbox Code Playgroud) 因为我是 antlr 的新手,所以我在语法谓词方面有很多问题。我一直在尝试转换这个语法,它是整洁语法的一部分,以便用 antlr4 解析它,我真的很困惑如何以有意义的方式改变它。
date_time
: (
(date)=>date (date_time_separator explicit_time)?
| explicit_time (time_date_separator date)?
) -> ^(DATE_TIME date? explicit_time?)
| relative_time -> ^(DATE_TIME relative_time?)
;`
Run Code Online (Sandbox Code Playgroud) 我正在使用 ANTLR4 生成 java 源代码的 AST,但我不得不转向 ANTLR3,因为我没有得到太多帮助和文档,而且确实很难继续。我设法生成 AST,但不是以可视格式生成。然后我遇到了一个很棒的答案 ,我确实能够在 DOT 文件中生成 AST,但有一个小问题。
我的代码:
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;
class Main {
public static void main(String[] args) throws Exception {
parseFile("/home/satnam-sandhu/Workstation/ASTGenerator/resource/java/Blabla.java");
}
public static void parseFile(String f)throws Exception {
JavaLexer lexer = new JavaLexer(new ANTLRFileStream(f));
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
CommonTree tree = (CommonTree)parser.compilationUnit().getTree();
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 gradle,所以我通过以下方式构建项目:
gradle clean …Run Code Online (Sandbox Code Playgroud) ANTLR 适合这个项目吗?
\n\n我正在寻找处理和转换用户输入的字符串,其中可能包含自定义函数。例如,用户可能会在字符串中写入类似 $CAPITALIZE('word') 的内容,而我想使用 StringUtils 在后台执行\n实际转换。
\n\n我想用户有时会编写嵌套函数,例如:
\n\n$RIGHT_PAD($RIGHT($CAPITALIZE('a123456789'),6),3,'0')
\n\n其中预期输出为字符串值“A12345000”。
\n\n我尝试使用正则表达式将函数分开,但一旦嵌套,就不那么容易了。我想我可以尝试编写自己的解析器,在进行研究时我发现了一篇建议使用 ANTLR 的文章。
\n\nANTLR 适合这样做吗?如果是这样,是否有任何类似的示例可供我查看?或者有人可以给我一个例子,说明如何在 ANTLR 中编写此代码,以便我可以拥有可以单独处理和以嵌套方式处理的自定义函数。
\n\n功能:
\n\n我最近开始学习Antlr并下载AntlrWorks 1.4,据说包括Antlr 3.2.现在,3.2应该支持像' - >'这样的重写规则语法,但是我甚至无法得到基于Lexer或Parser规则构建的最简单的情况:
grammar TestRewrite;
ab : a b -> a;
a : A;
b : B;
A : 'a';
B : 'b';
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到错误:
[11:26:29] error(100): TestRewrite.g:3:13: syntax error: antlr: TestRewrite.g:3:13: unexpected token: a
Run Code Online (Sandbox Code Playgroud)
为什么是这样.结构看起来很简单:ab应该生成一棵树,其中只捕获一个节点.不是你怎么做的?我无法使用rooting('^')或忽略('!').我很困惑.
鉴于语法
test : 'test' ID '\n' 'begin' '\n' 'end' '\n' -> ^(TEST ID);
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
Run Code Online (Sandbox Code Playgroud)
和测试字符串
"test blah\n begin\n end\n"
Run Code Online (Sandbox Code Playgroud)
导致
line 1:0 mismatched input 'test blah\\n begin\\n end\\n' expecting 'test'
<mismatched token: [@0,0:21='test blah\\n begin\\n end\\n',<12>,1:0], resync=test blah
begin
end
>
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
antlr3 ×10
antlr ×6
antlr4 ×5
antlrworks ×3
java ×2
antlrv3ide ×1
dot ×1
grammar ×1
natty ×1
netbeans ×1