Исправлен формат чисел в ANTLR - PullRequest
1 голос
/ 21 апреля 2010

Как указать фиксированный номер в грамматике antlr?

Я хочу разобрать строку, которая содержит поля с фиксированным количеством символов. Каждое поле является числом.

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

Приведенная выше строка является образцом. | указывает границы поля (которых не будет в реальном файле. показано здесь только для обозначения границы).

Поля могут содержать пустые символы + / -

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Я бы сохранял грамматику лексера настолько простой, насколько это возможно, и просто сопоставлял бы ноль или более пробелов, за которыми следовал бы необязательный знак, за которым следовал бы номер в вашей грамматике синтаксического анализатора. После сопоставления, проверьте (в вашей грамматике синтаксического анализатора), правильна ли "ширина" поля.

Пример грамматики:

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
  :  ' '+
  ;
0 голосов
/ 21 апреля 2010

А как насчет следующего:

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