2011-04-24 53 views
1

我目前正在尝试为我们在公司中使用的内部语言编写基于Eclipse的编辑器。语言是形式的语句的集合:在Xtext中解析字符串

{action}: {arguments} 

...在自己的行。 {arguments}的格式取决于正在执行的{action}的类型。脚本片段的示例可能如下所示:

banner: Some string with numbers and punctuation (23) in it! 
# some comment 
timeout: 42 

我的问题是解析这样的片段。我有评论和超时声明的工作,但我似乎无法创建一个规则来覆盖横幅声明。我所有的尝试都导致Antlr“令牌定义不可达”警告,或编辑器无法匹配输入。我试过横幅声明以下规则:

Banner: 
    'banner:' name=ANY_OTHER*; 

Banner: 
    'banner:' name=FF_STRING; 
terminal FF_STRING : ('a'..'z'|'A'..'Z'|'0'..'9'|'.'|':'|' ')+; 

...使我有ANTLR警告。我提出的一个黑客就是简单地创建一个与SL_COMMENT完全相同的终端,在开始时使用'banner:'而不是'#'。缺点是我没有语法着色,自动完成列表中也没有显示“横幅”。

欢迎任何建议。

回答

4

您可以尝试使用数据类型规则和一组缩减的终端规则。 像这样的东西可以工作:

Banner 
    'Banner:' name=Value; 
Value hidden(): 
    (ID | WS | INT | <any keyword from your grammar>)* LineBreak; 
terminal LineBreak: '\r' '\n'? | '\n'; 
termianl WS: (' '|'\t') * 
+0

感谢您的答复。这似乎工作,虽然我仍然得到antlr“决定可以匹配输入,如...”类型的警告,当我试图在我的价值规则中添加':'。我认为这是因为我将':'作为一个单独的关键字紧跟在“横幅”之后(即横幅和冒号之间可能有空格)。 – Exponent 2011-04-26 03:07:40