Единственный способ увидеть, как вы могли бы это сделать, это определить правило 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
(мне пришлось немного повернуть изображение, иначе его бы вообще не было видно!)
НТН.