ANTLR中的固定数字格式

时间:2010-04-21 08:44:59

标签: antlr grammar

如何在antlr语法中指定固定的数字?

我想解析一个包含固定字符数字段的行。每个字段都是一个数字。

0034 | 9056 | 4567 | 0987 | -2340 | 345 | 1000

以上行是一个示例行。 |表示字段边界(不在实际文件中。此处显示的仅表示边界)。

字段可以包含空白字符+/-

2 个答案:

答案 0 :(得分:1)

我保持lexer语法尽可能简单,只需匹配零个或多个空格后跟一个可选符号,后跟解析器语法中的数字。匹配后,检查(在您的解析器语法中)字段的“宽度”是否正确。

示例语法:

line
  :  field ('|' field)*
  ;

field
  :  Spaces? ('+' | '-')? Number // validate if 'field' is correct in this rule  
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;

可能的验证方案如下:

line
  :  field ('|' field)*
  ;

field
@init{int length = 0;}
  :  (Spaces {length += $Spaces.text.length();})? 
     ('+' | '-')? Number {length += $Number.text.length(); if(length != 4) {/* do something */}}
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;

答案 1 :(得分:-1)

以下内容如何:

INT : ('+'|'-')? ('0'..'9')+;