【问题标题】:How to simulate a user's input (only internally)?如何模拟用户的输入(仅限内部)?
【发布时间】:2015-05-31 18:00:45
【问题描述】:

我需要在我的 Eclipse 插件(使用 Xtext 创建)运行时解析某些内容,然后将其视为用户已键入它,但实际上不会弹出并且用户可以看到它作为自己的输入。
例如,我有这个输入:

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

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

i = 1;

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

问候 Krzmbrzl

编辑:
总而言之,我想要添加一条语句 i=1;到 AST

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

【问题讨论】:

  • 抱歉,您能否编辑您的问题以明确您的问题是什么?我认为它可以通过在 AST 中综合添加 i = 1; 来解决。
  • 这正是我的问题所在...如何将其添加到 AST...我将编辑我的问题以使其更清晰
  • 好吧,反过来。你为什么需要它?你想用它做什么?我问是因为向 AST 添加语句是一个非常糟糕的主意。你是在实现解释器还是生成器?
  • 我已经用这些信息更新了我的问题

标签: xtext xtend


【解决方案1】:

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

不管怎样,我经常使用的两个技巧是:

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

    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 '"';
    

如果您发布与此特定问题相对应的语法,我们可以开发一个安全的解决方案。在编辑器的实时处理内容期间向 AST 添加任何内容都会导致错误状态,从而破坏您的文档。

【讨论】:

  • 这确实是一个更好的解决方案,这也帮助我解决了另一个类似的问题。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2021-03-05
相关资源
最近更新 更多