如何模拟用户的输入(仅在内部)?

时间:2015-05-31 18:00:45

标签: xtext xtend

我需要在我的eclipse插件(使用Xtext创建)的运行时解析一些东西,然后将其视为用户输入但没有实际弹出并且可以将用户看作是他自己的输入。
例如,我有这样的输入:

for "i" from 1 to 3 do {};

我的问题是这个输入是变量i没有被声明为带有“=”的普通声明但是我需要解析器来告诉它是一个。所以我想让解析器解析

i = 1;

因此它将其识别为正常声明并允许对其进行交叉引用。

问候Krzmbrzl

编辑:
总而言之,我想要的是添加一个声明i = 1;到AST

我只想拥有对现有语言的eclipse支持,所以我不是在写一个解释器,也不是一个生成器。问题是当我有一个类似上面的for循环时,该语言的实际解释器声明了一个变量i(或者它在循环头中命名),因此这个变量在循环体中可用。在我的情况下,我的解析器不会将i识别为变量,因为它只知道声明是通过“=”完成的,所以我不能在循环体中使用i(如果我尝试这样,我得到的声明我的错误无法解决)。这就是我想在创建这样的循环时手动添加此声明的原因。我不需要担心任何编译或解释困难,因为我自己不这样做。正如我已经说过的,我只想拥有这种语言的所有酷日食功能。

1 个答案:

答案 0 :(得分:1)

好的,现在我明白了你的问题。将任何元素添加到AST以解决任何交叉引用仍然是个好主意!你不这样做!相反,您应该尝试以"i"for "i" from ...是变量的兼容声明的方式重构语法。有几个技巧可以做到这一点。您是否完全阅读了Xtext文档?还看过Xtext书吗?这两个文档都讲述了如何使Xtext做出你不会期望的事情。

无论如何,我经常使用的两个技巧是:

  1. 引入一个未使用的抽象Parser规则,然后您可以将其用作交叉引用的目标,但不会将其用作属性(包含引用)。

    AbstractDecl:
        VarDecl | ForVarDecl;
    VarDecl:
        name=ID ...;
    ForVarDecl:
        '"' name=ID '"';
    For:
        'for' decl=ForVarDecl 'from' from=INT 'to' to=INT 'do' block=Block;
    ...
    StatementWithCR:
        ref=[AbstractDecl] ...;
    
  2. 定义任何ParserRule,返回另一种类型。

    ForDecl returns VarDecl:
         '"' name=ID '"';
    
  3. 如果您要发布与此特定问题相对应的语法,我们可以开发一个安全的解决方案。在编辑器的实时处理内容期间向AST添加任何内容将导致错误的状态,这可能会破坏您的文档。