0

我已经为此工作了超过 2 天,但没有成功。这将是一个常见问题,但我找不到解决方案。我确实搜索过!

问题:

我有一些数据要读取,比如每行 5 个值。我知道我想从之前读取的值中读取多少。例如,要读取的 6 个值,分布在 2 行中......

6
10 20 30 40 50
60

所以在每5个变量之后我想读一个新行。如果有 0 个变量,我想跳过这一点,如果我想读取 5 个变量的精确倍数,那么我想避免重复 NL 调用。

我试过这个...

varblock[ Integer count ]
@init{
Integer varIndex = 0;
}
    : { count > 0 }? ( dp=NUMBER { count--; varIndex++;  }
          { ( varIndex \% 5 ) == 0 }? NL { varIndex = 0; }
          )+ { varIndex > 0 }? => NL
    |
    ;

但我得到...

failed predicate: { ( varIndex \% 5 ) == 0 }?

可能是我误解了谓词。我的语法中有几个其他谓词似乎有效,但它们不是这种类型。在那里,我试图根据输入文件的版本跳过一些语法。

谢谢。

4

2 回答 2

0

NL 只是输入行末尾的换行符。

NL    :   ( '\n' | '\r' )+ ;

在其他行中,我们阅读了其他一些内容,例如...

“IPE270” “BS 7191 GR 355C” 0.0 0 0

并且诸如 STRING、FLOAT 或 NUMBER 之类的值必须按预期顺序出现在这些行上。因此,如果我们在读取必要的数据值之前遇到 NL,就会出现语法错误。所以,也许你的问题的答案是“是”。

也许我只是(结束了?)简化了这个例子。

于 2013-01-08T19:04:28.907 回答
0

已解决:这是括号的问题。我查看了生成的解析器代码以获取线索。

varblock[ Integer count ]
@init{
   Integer index = 0;
}
   : ( { count > 0 }? => ( NUMBER  { count--; index++; } 
                         | { (index \% 5) == 0 }? => NL ) )+ { index > 0 }? => NL
   |
  ;

每行最多读取 5 个值。

于 2013-01-22T11:07:16.317 回答