2

摘要:我希望为我自己的语言设置左右边距 - 排除语法检查的代码区域。

背景:使用 xtext,我正在尝试创建漂亮的 Cobol 编辑器。到目前为止,我完成了语法并遇到了边距和注释问题。

我可以在语法中包含左边距:在 '\n' 后最多 6 个 !'\n' 字符。

但这并不能解决我的问题。SLComment 以 '*' 开头,位于左起第 7 个位置。一旦我以某种方式排除每行中的前 6 个字符,我就可以使用 '\n' '*' -> '\n' 规则来捕捉它。

我不能只将其保留为 '*' -> '\n' 并将位置检查委托给 validate ,因为它弄乱了乘法规则,它当然使用了 '*'。在语法边距规则之后放置注释规则也不是一个解决方案,因为那样我无法在代码的第一行中捕获边距。

我也知道我不会使用语法规则来解决右边距问题(例如排除 78 位之后的区域)。

我想有一种方法可以干扰 xtext 正在检查的文本,但还没有找到解决方案或提示如何完成此操作。

还试图找出是否可以通过某种方式进行预处理,但也找不到任何提示。

或者也许可以同时使用两种语法。额外的一个会得到每一行并隐藏边距?

希望我能够描述我面临的问题以及到目前为止我尝试了什么。

4

1 回答 1

0

我想你可以使用类似于 LINE_START_COMMENT 终端规则的东西来捕获每行的前 6 个字符,然后在整个语法中隐藏它。

terminal LINE_START_COMMENT: 
    // Up to 6 chars that are NOT a new line
    '\n' (!'\n')? (!'\n')? (!'\n')? (!'\n')? (!'\n')? (!'\n')?
;

然后,使用这种方法,我猜您还应该将整行注释规则修改为:

terminal FULL_LINE_COMMENT: 
    LINE_START_COMMENT '*' 
    (LINE_START_COMMENT '*' | !(LINE_START_COMMENT) )+
    (LINE_START_COMMENT)?
;

在这里,我定义了 FULL_LINE_COMMENT 在以下 LINE_START_COMMENT 之后结束。要检查几个连续的注释行,您必须接受任何不是注释终止符(在本例中为 LINE_START_COMMENT)或 LINE_START_COMMENT 后面带有新的“*”的内容作为注释。

于 2015-09-23T14:06:57.197 回答