一周前,我开始了以下项目:一种识别Java代码后缀的语法.
我使用ANTLRJava(Java.g4)的官方语法作为基线并开始添加一些规则.但是,这些新规则还引入了左递归,我也不得不处理.
经过几天的工作,我得到了以下代码.当我开始测试时,我注意到一些不寻常的东西,我仍然无法解释.当给出输入时{ },解析器告诉我no viable alternative at input '<EOF>',但当我在规则的右侧切换终端的顺序时s2,特别是如果我们将右手侧v2_1 | v2_2 | v2_3 ...改为v2_36 | v2_1 | v2_2 ...(终端v2_36移动到第一个位置),顺序{ }被接受.
我的第一个想法是Antlr没有回溯,因为我注意到在输入{ }时,解析器的第一个版本开始遵循规则v2_3,只是报告没有找到任何东西,并且没有尝试考虑其他选项(这是我的想法,但也许不是真的)这样的确v2_36给出了肯定的答案.
但是,经过一些研究,我发现ANTLR实际上是回溯,但只有在其他一切都失败的情况下.至少对于v3.3来说也是如此(在官方ANTLR文件中阅读),但我想这也是如此v4.现在我有点困惑.在这个项目上花了这么多个小时后,如果我不能让它工作,我会觉得非常糟糕.有人可以提供某种提示吗?非常感谢,谢谢.
编辑
管理将问题隔离到
grammar Java;
@parser::members {String ruleName; }
start : compilationUnitSuf EOF;
compilationUnitSuf
: {ruleName = "typeDeclarationSuf"; } s2
;
s2: '{' '}' …Run Code Online (Sandbox Code Playgroud) 我一直试图从谷歌街景中获取数据已有一段时间了.出于研究目的,我需要能够估计某个特定地图位置的天空区域.这就是为什么我需要估计球形视图,我认为使用谷歌街景是一个好主意.我真正需要的是一个3d方向我应该能够分辨出这个方向上像素的颜色.
我得出的是以下内容.我正在使用Google街景图像API下载6张图片,将它们用作立方体纹理(特别是我提交了6个带参数的查询:
(heading, pitch) = {(0, 0), (90, 0), (180, 0), (270, 0), (0, 90), (0, -90)}
Run Code Online (Sandbox Code Playgroud)
当我将这6个图像映射到立方体时,我得到的是以下内容:
问题是它似乎存在一些数值误差和角落不匹配.我知道如何解决它,但复杂性增长了很多.
我也查看了JavaScript API,但找不到从那里访问数据的方法.在官方指南页面上提到了UV映射
但似乎这仅针对用户生成的内容.
我错过了什么吗?有没有其他方法可以做到这一点?
如何将6个整数的数组转换为单个整数.下面提供了我想要做的例子.
阵: {0, 1, 2, 3, 4, 5, 6}
整数: 123456
谢谢!
在我查看时,C# Language Specification v4.0我注意到有一组规则被定义为:
invocationExpression:
primaryExpression '(' argumentList? ')'
primary-expression:
primary-no-array-creation-expression
array-creation-expression
primary-no-array-creation-expression:
literal
simple-name
parenthesized-expression
member-access
invocation-expression
element-access
this-access
base-access
post-increment-expression
post-decrement-expression
object-creation-expression
delegate-creation-expression
anonymous-object-creation-expression
typeof-expression
checked-expression
unchecked-expression
default-value-expression
anonymous-method-expression
base-access:
'base' '.' identifier
'base' '[' argument-list ']'
Run Code Online (Sandbox Code Playgroud)
当我试图匹配这个语句时(顺便说一下,这是正确的语句,我看到它在项目中使用过)
base.VisitList<T>(list, visitor);
Run Code Online (Sandbox Code Playgroud)
根据给定的规则,我没有看到如何做到这一点.不应该base-access定义为:
base-access:
'base' '.' identifier type-parameter-list(opt)
'base' '[' argument-list ']'
Run Code Online (Sandbox Code Playgroud)
或者类似的东西以这种方式语法能够捕获声明?
编辑我看到的例子是项目的C#版本,db4o它是这样的(我删除了大部分声明,只留下了重要的声明)
internal abstract class ExpressionVisitor
{
protected virtual void VisitList<T>()
{
}
}
internal class HashCodeCalculation : ExpressionVisitor
{
protected …Run Code Online (Sandbox Code Playgroud) 为什么当我Plot[E^(-x), {x, 0, 2}]在Mathematica 8中输入命令时,该点(2, e^(-2))位于X轴下?我该如何解决这个问题?
我正在尝试计算数组的整数并将这些整数的计数存储在另一个数组中.
代码计算整数的出现次数,但继续计算不同整数的其余部分而不用计数.代码仅存储第一个整数出现的计数而没有问题.
我的问题是,当循环到达下一个整数时,计数不会重置,并继续从最后的整数计数开始计数并显示它.
如何改进我的代码以查找每个整数的整数出现?
public count() {
int k[] = {1,1,2,2};
int t[] = {0,0,0,0,0};
int count = 0;
System.out.println("reset count: "+count);
for (int f = 0; f<k.length; f++) {
for (int i =1; i < k.length-1; i++) {
for (int g = 0; g < t.length; g++ ) {
if (k[f] == i) {
count++;
System.out.println("Integer = "+i);
System.out.println("count: "+count);
t[g] = count;
}
i++;
}
}
}
System.out.println();
for (int o = 0; o < t.length; o++) { …Run Code Online (Sandbox Code Playgroud)