我目前正在尝试为我们在公司使用的内部语言编写基于Eclipse的编辑器。该语言是以下形式的语句集合:
{action}: {arguments}
......在自己的路上。 {arguments}的格式取决于正在执行的{action}的类型。脚本片段的示例可能如下所示:
banner: Some string with numbers and punctuation (23) in it!
# some comment
timeout: 42
我的问题是解析这样一个片段。我有评论和超时声明工作,但我似乎无法创建一个规则来涵盖横幅声明。我的所有尝试都导致Antlr“令牌定义无法访问”警告,或者编辑器无法匹配输入。我已经为banner语句尝试了以下规则:
Banner:
'banner:' name=ANY_OTHER*;
和
Banner:
'banner:' name=FF_STRING;
terminal FF_STRING : ('a'..'z'|'A'..'Z'|'0'..'9'|'.'|':'|' ')+;
......这给了我一些警告。我想到的一个黑客就是简单地创建一个与SL_COMMENT相同的终端,在开头用'banner:'而不是'#'。缺点是我没有获得语法着色,也没有在自动完成列表中显示“banner”。
欢迎任何建议。
答案 0 :(得分:4)
您可以尝试使用数据类型规则和一组简化的终端规则。 这样的事情可以奏效:
Banner
'Banner:' name=Value;
Value hidden():
(ID | WS | INT | <any keyword from your grammar>)* LineBreak;
terminal LineBreak: '\r' '\n'? | '\n';
termianl WS: (' '|'\t') *