如何模拟用户的输入(仅限内部)?
How to simulate a user's input (only internally)?
我需要在我的 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"
in for "i" from ...
是变量的兼容声明的方式重构语法。有几个技巧可以做到这一点。您是否完整阅读了 Xtext 文档?也看过Xtext的书?这两份文件都讲述了很多关于如何让 Xtext 做一些你意想不到的事情。
反正我常用的两个技巧是:
引入一个未使用的抽象解析器规则,然后您可以将其用作交叉引用的目标,但永远不会用作属性(包含引用)。
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] ...;
定义任何 ParserRule,returns 另一种类型。
ForDecl returns VarDecl:
'"' name=ID '"';
如果您 post 对应于这个特定问题的语法,我们可以开发一个安全的解决方案。在编辑器的实时处理内容期间向 AST 添加任何内容都会导致错误状态,从而破坏您的文档。
我需要在我的 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"
in for "i" from ...
是变量的兼容声明的方式重构语法。有几个技巧可以做到这一点。您是否完整阅读了 Xtext 文档?也看过Xtext的书?这两份文件都讲述了很多关于如何让 Xtext 做一些你意想不到的事情。
反正我常用的两个技巧是:
引入一个未使用的抽象解析器规则,然后您可以将其用作交叉引用的目标,但永远不会用作属性(包含引用)。
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] ...;
定义任何 ParserRule,returns 另一种类型。
ForDecl returns VarDecl: '"' name=ID '"';
如果您 post 对应于这个特定问题的语法,我们可以开发一个安全的解决方案。在编辑器的实时处理内容期间向 AST 添加任何内容都会导致错误状态,从而破坏您的文档。