ANTLR读取值块

时间:2013-01-08 13:56:41

标签: antlr

我已经在这方面工作了两天多没有成功。这将是一个常见问题,但我无法找到解决方案。我确实做了搜索!

问题:

我有一些我想读的数据,每行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 }?

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

感谢。

2 个答案:

答案 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个值。