如何在ANTLR中实现运算符优先级?
我目前正在使用XText/Antlr包.
编辑:
我做了sepp2k建议的,现在运算符优先级有效,但是3 +*这样的东西现在也可以工作了.操作员基本上"摔倒"树.
另外,我在ANTLR的网站上尝试了C语法,同样的事情发生在ANTLRworks中.
谁知道问题是什么?
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' | '-')? MultDivOp;
MultDivOp:
('*' | '/')? ExpOp;
ExpOp:
'^'? expr=Expression;
Run Code Online (Sandbox Code Playgroud) 几年前,我在本科学习期间一直在研究Flex,Bison.但是,我现在不记得了.最近,我听说过ANTLR.
我有一个ANTLR JavaScript语法(取自Internet),它似乎支持除正则表达式文字之外的所有内容.
正则表达式文字的问题在于你有两个规则,基本上:
multiplicativeExpression
: unaryExpression (LT!* ('*' | '/' | '%')^ LT!* unaryExpression)*
Run Code Online (Sandbox Code Playgroud)
和
regexLiteral
: '/' RegexLiteralChar* '/'
Run Code Online (Sandbox Code Playgroud)
规则RegexLiteralChar使用不同于正常表达式的词法规则(例如,双引号不会终止它).
这意味着我需要以某种方式从我的解析器中改变某种词法分析器状态.我怎样才能做到这一点?它甚至可能吗?
我有以下片段的定义:
fragment CHAR :'a'..'z'|'A'..'Z'|'\n'|'\t'|'\\'|EOF;
Run Code Online (Sandbox Code Playgroud)
现在我必须为字符串定义词法分析器规则.我做了以下事情:
STRING : '"'(CHAR)*'"'
Run Code Online (Sandbox Code Playgroud)
但是在字符串中我希望匹配除新行'\n'以外的所有字符.有什么想法我能做到吗?
我已经创建了新的Gradle项目
apply plugin: 'antlr'
Run Code Online (Sandbox Code Playgroud)
和
dependencies {
antlr "org.antlr:antlr4:4.5.3"
Run Code Online (Sandbox Code Playgroud)
到build.gradle.
创建src/main/antlr/test.g4具有以下内容的文件
grammar test;
r : 'hello' ID;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
但它不起作用.没有生成java源文件(并且没有发生错误).
我错过了什么?
项目在这里:https://github.com/dims12/AntlrGradlePluginTest2
UPDATE
我发现我的样本实际上是有效的,但它把代码放到\build\generated-src了我没想到的地方:羞耻:
我试图解析ANTLR中的数据文件 - 它具有可选的空格
3 6
97 12
15 18
Run Code Online (Sandbox Code Playgroud)
以下显示了行的开始和结束位置.最后有一个换行符,没有标签.
^ 3 6$
^ 97 12$
^ 15 18$
^
Run Code Online (Sandbox Code Playgroud)
我的语法是:
lines : line+;
line : ws1 {System.out.println("WSOPT :"+$ws1.text+":");}
num1 {System.out.println("NUM1 "+$num1.text);}
ws2 {System.out.println("WS :"+$ws2.text+":");}
num2 {System.out.println("NUM2 "+$num2.text);}
NEWLINE
;
num1 : INT ;
num2 : INT ;
ws1 : WSOPT;
ws2 : WS;
INT : '0'..'9'+;
NEWLINE : '\r'? '\n';
//WS : (' '|'\t' )+ ;
WS : (' ')+ ;
WSOPT : (' ')* ;
Run Code Online (Sandbox Code Playgroud)
这使
line 1:0 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个准确的AS3语法(格式不是问题,但我认为ANTLR最具特色)用于我正在制作的练习语法.
什么是AS3最准确的语法?
我有这个简单的语法:
expr: factor;
factor: atom (('*' ^ | '/'^) atom)*;
atom: INT
| ':' expr;
INT: ('0'..'9')+
Run Code Online (Sandbox Code Playgroud)
当我跑它时它说:
决策可以使用多个替代1,2匹配输入,例如'*'
决策可以使用多个备选方案1,2匹配输入,例如'/'
我无法发现模棱两可.红色箭头是如何指向的?任何帮助,将不胜感激.

如何使用ANTLR从java src代码生成AST?
任何帮助?
我使用ANTLRv3IDE插件已经使用ANTLR和Eclipse一段时间了.虽然它并不完美,而且有点过时,但它的工作做得相当不错.
现在我希望切换到ANTLRv4用于我正在创建的另一个DSL.但是,Eclipse支持似乎非常薄.我决定尝试一个NetBeans插件的ANTLRWorks,但是我无法安装它(它似乎被锁定到特定的日期版本(201302132200,而我有更新的东西,仍然是文档说的7.3)依赖项).
所以,问题是:有没有人设置任何 Java IDE(最好是Eclipse,但我可以被说服切换,如果支持对其他东西有好处)与ANTLR集成?使用集成,我的意思是:代码生成保存/键盘快捷方式和语法着色(至少).代码完成和其他功能当然很好,但我现在可以没有它们.
我很清楚Xtext,我在一些项目中使用它非常成功,但遗憾的是它不适合这里的需求(不需要IDE支持,需要我自己的DSL模型不基于ECore等).
我知道ANTLRWorks可以在没有Java IDE的情况下作为独立应用程序运行,但我认为这是最后的解决方案,因为以这种方式工作非常麻烦(在应用程序之间切换,文件不同步,没有VCS支持等) .我尝试了另一种方法:将Java部件安装到ANTLRworks(它本身就是一个NetBeans发行版)中,但它并没有很好地结束(似乎基本的项目支持等被从ANTLRworks中删除).
antlr ×10
java ×4
antlr4 ×2
antlr3 ×1
antlrworks ×1
bison ×1
bnf ×1
char ×1
ebnf ×1
eclipse ×1
flex-lexer ×1
gradle ×1
grammar ×1
javascript ×1
jflex ×1
match ×1
string ×1
whitespace ×1
xtext ×1