[英]identifier token keyword antlr parser
如何处理令牌'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
谢谢。
我知道如何做到这一点的唯一方法是在词法分析器语法中定义一个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!
有了它,它看起来像:
alt text http://img571.imageshack.us/img571/5713/grammar.png
(我不得不稍微旋转图像,否则它根本不可见!)
HTH。
嗯,这很简单,大多数语法使用这样的东西:
TOKEN_REF
: 'A'..'Z' ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;
因此,当提到print语句时,您会执行以下操作:
'print' (TOKEN_REF)*
并且使用for语句,你只需说明'for',例如:
'for' INT 'in' SOMETHING
为了做到这一点,你需要使用语义谓词,只有当它真正是for
关键字时才采用该词法分析器规则。
有关详细信息,请参阅ANTLR wiki上的标识符关键字 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.