我已经在这方面工作了两天多没有成功。这将是一个常见问题,但我无法找到解决方案。我确实做了搜索!
我有一些我想读的数据,每行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 }?
可能是我误解了谓词。我的语法中有几个其他谓词似乎有用,但它们不属于这种类型。在那里,我试图跳过一些语法,具体取决于输入文件的版本。
感谢。
答案 0 :(得分:0)
NL只是输入行末尾的换行符。
NL : ( '\n' | '\r' )+ ;
在其他方面,我们读了几个其他的东西,比如......
“IPE270”“BS 7191 GR 355C”0.0 0 0
并且STRING,FLOAT或NUMBER等值必须位于预期序列中的那些行上。因此,如果我们在读取必需的数据值之前遇到NL,则会出现语法错误。所以,也许你的问题的答案是“是”。
也许我只是(过度?)简化了这个例子。
答案 1 :(得分:0)
解决: 这是一个括号问题。我查看了生成的解析器代码以获得线索。
varblock[ Integer count ]
@init{
Integer index = 0;
}
: ( { count > 0 }? => ( NUMBER { count--; index++; }
| { (index \% 5) == 0 }? => NL ) )+ { index > 0 }? => NL
|
;
这读取每行最多5个值。