我试图在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
答案 0 :(得分:1)
This slide deck显示了我们如何在Xtext DSL中实现空白块作用域。
我们使用了与缩进相对应的BEGIN
和与缩进相对应的END
的合成令牌。
(注意:该语言随后被重命名为RAPID-ML,作为RepreZen API Studio的功能之一。)
答案 1 :(得分:0)
我认为您的主要问题是,您的多线令牌结束时尚未定义。在您找到解决方案之前,您必须在脑海中清楚地了解算法应如何确定令牌的结束。没有工具可以从你身上带走这种精神负担。
问题:没有结束标记字符。您必须定义这样的字符(与YAML不同)或以anather方式定义令牌的结尾。例如通过某种语义空格(我认为YAML就是这样)。
第一种方法会让事情变得非常简单。只需阅读内容,直到找到结束字符。使用自定义词法分析器可能可以管理sescond方法。基本上,您可以使用自己实现的解决方案替换生成的词法分析器,该解决方案能够使用空白或类似方法。
以下是关于如何做到这一点的一些起点(不同的方法可以思考):