3

如何处理在语言中两种不同情况下使用token '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

谢谢。

4

3 回答 3

1

我看到你如何去做的唯一方法是Echo在你的词法分析器语法中定义一个规则,它匹配除andecho之外的所有其他字符后跟的字符:\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

(我不得不稍微旋转一下图像,否则根本看不到它!)

HTH。

于 2010-05-04T07:20:26.640 回答
0

为了做到这一点,您需要使用语义谓词来仅在它确实是for关键字时采用该词法分析器规则。

详细信息可在 ANTLR wiki 上的关键字作为标识符页面上找到。

于 2010-05-11T22:30:45.610 回答
-1

好吧,这很容易,大多数语法都使用这样的东西:

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

因此,当引用打印语句时,您会执行以下操作:

'print' (TOKEN_REF)*

使用 for 语句,您只需明确声明“for”,例如:

'for' INT 'in' SOMETHING
于 2010-04-27T17:23:19.220 回答