我正在为学校项目创建一个简单的编程语言.我正在使用ANTLR 4从我的语法生成词法分析器和解析器.到目前为止,我一直在使用ANTLRs监听器模式来应用编程语言的实际功能.
现在我想实现if/else语句,但是我不确定在使用监听器模式时这些实际上是可以实现的,因为ANTLR决定在使用监听器时遍历解析树的顺序,我想是if /的实现else语句将要求在解析树周围跳转,具体取决于语句中的条件是否满足.
任何人都可以告诉我是否可以使用ANTLR实现if/else语句,或者我是否必须自己实现访问者模式?另外,任何人都可以给出一个非常简单的实现语句的例子吗?
在决定从v3切换到v4后,我需要帮助我的ANTLR 4语法.我对ANTLR不太熟悉,所以如果我的问题很愚蠢,我真的很抱歉;)
在v3中,我使用以下代码来检测Java样式的注释:
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
在v4中,没有特定于规则的选项.操作(移至隐藏频道)也无效.
有人可以给我一个提示如何在ANTLR v4中做到这一点吗?
我仍然在寻求一种非常简单的语言,现在我知道没有.所以我自己用ANTLR3写一个.
我在这个答案中找到了一个很好的例子:
Exp.g:
grammar Exp;
eval returns [double value]
: exp=additionExp {$value = $exp.value;}
;
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
( '+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
multiplyExp returns [double value]
: a1=atomExp {$value = $a1.value;}
( '*' a2=atomExp {$value *= $a2.value;}
| '/' a2=atomExp {$value /= $a2.value;}
)*
;
atomExp returns [double value]
: n=Number {$value = Double.parseDouble($n.text);}
| '(' exp=additionExp ')' {$value = …Run Code Online (Sandbox Code Playgroud) 假设我有以下所有打包的Java API blocks.jar:
public class Block {
private Sting name;
private int xCoord;
private int yCoord;
// Getters, setters, ctors, etc.
public void setCoords(int x, int y) {
setXCoord(x);
setYCoord(y);
}
}
public BlockController {
public static moveBlock(Block block, int newXCoord, int newYCoord) {
block.setCooords(newXCoord, newYCoord);
}
public static stackBlocks(Block under, Block onTop) {
// Stack "onTop" on top of "under".
// Don't worry about the math here, this is just for an example.
onTop.setCoords(under.getXCoord() + onTop.getXCoord(), under.getYCoord());
} …Run Code Online (Sandbox Code Playgroud) 我有一个相对简单的DSL,我想比一堆手动编码的java.util.regex.Pattern语句+解析逻辑更强大地处理.
最引用的工具似乎是ANTLR.我不熟悉它,我愿意尝试一下.但是当我查看示例时(例如,ANTLR 表达式计算器示例,或Martin Fowler的HelloAntlr,或者stackoverflow上的其他Q),我有点怀疑.这样做的原因是语法文件看起来像是一个语法定义的大杂烩,其中散布着本质上必不可少的实现语言(例如Java)的片段.
我真正喜欢的是分离出解析器的命令/评估部分.有没有办法使用ANTLR(或其他工具)来定义语法并生成一组Java源文件,以便它可以编译成可用于将输入解析为结构的类而无需对该结构进行操作?
例如,如果我只想使用+和*和()运算符一起使用表达式求值,那么我就得到了输入
3*(4 + 7*6)*(3 + 7*(4 + 2))
那么我想要做的就是编写一个语法来将其转换为类似的层次结构
Product
Term(3)
Sum
Term(4)
Product
Term(7)
Term(6)
Sum
Term(3)
Product
Term(7)
Sum
Term(4)
Term(2)
Run Code Online (Sandbox Code Playgroud)
我可以在哪里使用类
interface Expression<T> {
public T evaluate();
}
class Term implements Expression<Double> {
final private double value;
@Override public Double evaluate() { return value; }
}
class Product implements Expression<Double> {
final private List<Expression<Double>> terms;
@Override public Double evaluate() …Run Code Online (Sandbox Code Playgroud) 我想在Android上使用ANTLR,我发现了这个: ANTLR和Android
下载AntlrJavaRuntime后,我不知道该怎么做,我应该这样做:
1. lunch the appropriate target
2. make AntlrJavaRuntime
3. verify that AntlrJavaRuntime.xml was placed in /system/etc/permissions and
4. AntlrJavaRuntime.jar was placed in /system/framework
5. after this, you can run a normal make
Run Code Online (Sandbox Code Playgroud)
首先,第1步甚至意味着什么?
其次,当我尝试做:make AntlrJavaRuntime我得到以下错误:
~/AntlrJavaRuntime$ make AntlrJavaRuntime
make: Nothing to be done for `AntlrJavaRuntime'.
Run Code Online (Sandbox Code Playgroud)
很难找到有关这方面的文档,因此非常感谢任何帮助(或者是如何让ANTLR为Android项目做好准备的明确示例).
我正在尝试为学习目的构建一个简单的解释语言.我已经阅读了关于ANTLR和JavaCC的无数理论和教程,但我无法弄清楚如何让它做一些有用的事情.
我通过"分开并将它重新组合在一起"来学习最好的东西,那么,有没有使用ANTLR等工具实现简单语言的工作示例?
像下面这样的东西可能会很好:
x = 1
if x == 1
print "true"
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试创建一个能够解释动态字符串的软件组件,例如:
%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT"))
Run Code Online (Sandbox Code Playgroud)
这会产生这个字符串:
asampletext
Run Code Online (Sandbox Code Playgroud)
我希望能够定义一组可用的函数,具有语义参数等.我已经知道(或多或少)如何使用正则表达式来完成它.
我的问题是:
谢谢!
是否可以在 java 模式中使用正则表达式全局 g 标志?
我尝试过,final Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
但它的行为不像全局标志。
我们在 java 中有任何解决方法吗?
我的正则表达式是:
private final String regex ="(public|private|protected|static|final|abstract|synchronized|volatile)\\s*([\\w<>\\[\\]]+)\\s*(\\w+)\\s*\\(([\\w\\s\\w,<>\\[\\]]*)?\\)\\s*(\\bthrows\\b)?[\\s\\w\\s,\\w]*\\{[\\n\\t]*(.+)[\\n\\t]*((return|throw){1}\\s*)(\\w*)\\s*;\\s*[\\}]";
输入是文件内容,类似于下面正则表达式链接中提到的内容:https : //regex101.com/r/u7vanR/3
我想要 java 模式找到这两个出现,但是使用 java 正则表达式标志它只是找到第一个而不是两个。
我想进行一些实验,并在String中生成一个java程序(实验本身就是Java).
现在我想测试它是否编译.如何String在Java中获取对象并查看它是否是合法的Java代码?
澄清:
String prog = "public interface B {public void speak();}"
boolean doesItCompile = ???
Run Code Online (Sandbox Code Playgroud) 我是ANTLR的新手,我正在尝试扩展这里提供的简单计算器的例子.具体来说,我尝试添加一些简单的函数,负数等,以熟悉自己的ANTLR.但是,我在尝试实现"隐式"乘法时遇到了一些问题(例如,3cos(2)sin(2)将被解释为3*cos(2)*sin(2)).
我在Stack Overflow上发现了一个同样问题的问题(这里).解决这个问题的一般形式看起来就像我自己找到的那样,所以我不确定我的问题在哪里.
我的语法如下.如果没有这| p2 = signExpr {$value *= $p2.value;}条线(最后一条线multiplicationExpr),根据我的测试,一切似乎都能正常工作.当我添加此行并运行它时antlr,我收到以下错误:
error(211): calculator.g:24:3: [fatal] rule multiplicationExpr has non-LL(*) decision due to recursive rule invocations reachable from alts 3,4. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
warning(200): calculator.g:24:3: Decision can match input such as "'-' FLOAT" using multiple alternatives: 3, 4
As a result, alternative(s) 4 were disabled for that input
Run Code Online (Sandbox Code Playgroud)
backtrack为我的一些(通常正常工作的)测试表达式启用错误计算结果.此外,警告谈论替代方案3和4 multiplicationExpr,但我只有三个替代方案,让我感到困惑.
有人能够指出我的语法中的错误,如下所示?
grammar calculator; …Run Code Online (Sandbox Code Playgroud) 我过去几个小时一直在网上搜索,试图学习一个使用ANTLR的简单例子.但是我很难理解这些例子.是否有任何正文可以在Java中输出:
如果我的意见是
printf("Hello World");
输出应该是:
你好,世界
如果我的意见是
inx = 1;
它应该给出一条错误信息.
我正在尝试使用java创建一个c ++编译器(从词汇开始直到语义部分),我真的想知道我应该做什么.
我正在使用Java解析文本.我在下面定义了一个语法:
Start := "(\\<)"
Stop := "(\\>)"
Var = "(\\w*)";
Cons = "([0-9]*)";
Type1 := Start ((Var | Cons) | TypeParent) (Type1 ((Var | Cons) | TypeParent))* Stop
Type2 := Start ((Var | Cons) | TypeParent) (Type2 ((Var | Cons) | TypeParent))* Stop
TypeParent := Type1 | Type2
...
etc
Run Code Online (Sandbox Code Playgroud)
我想将所有正则表达式组合成一个String模式并一次匹配.我的问题是当我开始在Type1和Type2行中使用递归语法元素时.我显然无法将递归定义提供给Java中的Pattern - 它只是一个带有正则表达式符号的String.
我想要的是,我可以以某种方式有一个逻辑开关,如果在这个块中:
(Type2 ((Var | Cons) | TypeParent)
Run Code Online (Sandbox Code Playgroud)
所有模式都匹配,除了Type2,我可以捕获所有其他组,但然后提取Type2标记应该是的字符串,然后再次递归地将它提供给regexer.最后我会得到一个基本案例:
(Var | Cons) | TypeParent)
Run Code Online (Sandbox Code Playgroud)
我意识到这不是正则表达式的意思 - 现在这是一个无上下文语法(?),因为它是递归的.但是,如果不考虑超级聪明的解析器,我认为这种方法是可以破解的.
思考?