Xtext - YAML中的多行字符串

时间:2018-04-15 17:49:18

标签: yaml xtext emf

我试图在Xtext中为类似YAML的DSL建模。在这个DSL中,我需要一些像YAML中的多行字符串。

description: | Line 1 line 2 ... 我的第一次尝试是这样的:

terminal BEGIN: 'synthetic:BEGIN'; // increase indentation terminal END: 'synthetic:END'; // decrease indentation terminal MULTI_LINE_STRING: "|" BEGIN ANY_OTHER END;

我的第二次尝试是 terminal MULTI_LINE_STRING: "|" BEGIN ((!('\n'))+ '\n')+ END; 但他们俩都没有成功。有没有办法在Xtext中执行此操作?

更新1:

我也试过这个替代方案。

terminal MULTI_LINE_STRING: "|" BEGIN ->END

当我触发"生成Xtext工件"过程中,我收到了这个错误:

3492 [main] INFO nerator.ecore.EMFGeneratorFragment2 - Generating EMF model code 3523 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://...' from 'platform:/resource/.../model/generated/....genmodel' error(201): ../.../src-gen/.../parser/antlr/lexer/Internal..Lexer.g:236:71: The following alternatives can never be matched: 1 error(3): cannot find tokens file ../.../src-gen/.../parser/antlr/internal/Internal...Lexer.tokens error(201): ../....idea/src-gen/.../idea/parser/antlr/internal/PsiInternal....g:4521:71: The following alternatives can never be matched: 1

2 个答案:

答案 0 :(得分:1)

This slide deck显示了我们如何在Xtext DSL中实现空白块作用域。

我们使用了与缩进相对应的BEGIN和与缩进相对应的END的合成令牌。

(注意:该语言随后被重命名为RAPID-ML,作为RepreZen API Studio的功能之一。)

答案 1 :(得分:0)

我认为您的主要问题是,您的多线令牌结束时尚未定义。在您找到解决方案之前,您必须在脑海中清楚地了解算法应如何确定令牌的结束。没有工具可以从你身上带走这种精神负担。

问题:没有结束标记字符。您必须定义这样的字符(与YAML不同)或以anather方式定义令牌的结尾。例如通过某种语义空格(我认为YAML就是这样)。

第一种方法会让事情变得非常简单。只需阅读内容,直到找到结束字符。使用自定义词法分析器可能可以管理sescond方法。基本上,您可以使用自己实现的解决方案替换生成的词法分析器,该解决方案能够使用空白或类似方法。

以下是关于如何做到这一点的一些起点(不同的方法可以思考):