идентификатор токена ключевое слово antlr parser - PullRequest
3 голосов
/ 27 апреля 2010

Как справиться со случаем, когда токен 'for' используется в двух разных ситуациях для анализа языка Например оператор и «параметр» в следующем примере:

echo for print example
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

Выход:

for print example
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 мая 2010

Единственный способ увидеть, как вы могли бы это сделать, это определить правило Echo в вашей грамматике лексера, которое соответствует символам echo, за которыми следуют все другие символы, кроме \r и \n:

Echo
  :  'echo' ~('\r' | '\n')+
  ;

и убедитесь, что это правило до , которое соответствует идентификаторам и ключевым словам (например, for).

Быстрая демонстрация возможного старта будет:

grammar Test;

parse
  :  (echo | for)*
  ;

echo
  :  Echo (NewLine | EOF)
  ;

for 
  :  For Identifier In range NewLine
     Do NewLine
     echo
     Done (NewLine | EOF)
  ;

range
  :  '{' Integer '..' Integer ('..' Integer)? '}'
  ;

Echo
  :  'echo' ~('\r' | '\n')+
  ;

For  : 'for';
In   : 'in';
Do   : 'do';
Done : 'done';

Identifier
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

Integer
  :  '0'..'9'+
  ;

NewLine
  :  '\r' '\n'
  |  '\n'
  |  '\r'
  ;

Space
  :  (' ' | '\t') {skip();}
  ;

Если вы проанализируете ввод:

echo for print example
for i in {0..10..2}
do
  echo "Welcome $i times"
done
echo the end for now!

с ним это будет выглядеть так:

альтернативный текст http://img571.imageshack.us/img571/5713/grammar.png

(мне пришлось немного повернуть изображение, иначе его бы вообще не было видно!)

НТН.

0 голосов
/ 12 мая 2010

Для этого вам нужно использовать семантический предикат, чтобы использовать это правило лексера, только когда оно действительно является ключевым словом for.

Подробности доступны по ключевым словам в качестве идентификаторов на странице вики ANTLR.

0 голосов
/ 27 апреля 2010

Ну, это довольно просто, большинство грамматик использует что-то вроде этого:

TOKEN_REF
    :   'A'..'Z' ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
    ;

Поэтому, ссылаясь на оператор печати, вы делаете что-то вроде:

'print' (TOKEN_REF)*

А с оператором for вы просто заявляете о состоянии экспликации, например:

'for' INT 'in' SOMETHING
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...