允许 xtext 语法中的多行字符串嵌入 javascript 代码
Allow multiline String in xtext grammar to embed javascript code
我正在编写一个小 "language" 来创建 javascript 代码。本质上它是 hiding/showing 一些 html 表单元素。但我需要为某些代码添加自定义 javascript 代码,例如在点击事件上做什么。
Action:
'on' eventName=ID 'do' code=CODE
;
terminal BEGIN: "!$";
terminal END: "$!";
terminal CODE:
BEGIN -> END
;
我现在可以用我的语言创建 Eclipse 插件和代码,但字段代码的值包含 BEGIN 和 END 字符。
on eventName do !$
var x = thisIsJavaScript();
console.log(x);
$!
我的价值是:
!$
var x = thisIsJavaScript();
console.log(x);
$!
我只想要中间没有 !$ 和 $! 的部分。
如有任何提示,我们将不胜感激。
非常感谢!
你应该为你的终端规则写一个值转换器
import org.eclipse.xtext.common.services.DefaultTerminalConverters;
import org.eclipse.xtext.conversion.IValueConverter;
import org.eclipse.xtext.conversion.ValueConverter;
import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.nodemodel.INode;
import com.google.inject.Inject;
public class MyDslConverters extends DefaultTerminalConverters {
@Inject
private CODEValueConverter codeValueConverter;
@ValueConverter(rule = "CODE")
public IValueConverter<String> CODE() {
return codeValueConverter;
}
public static class CODEValueConverter implements IValueConverter<String> {
@Override
public String toValue(String string, INode node) throws ValueConverterException {
return string.substring(2, string.length()-2);
}
@Override
public String toString(String value) throws ValueConverterException {
return "!$" + value + "$!";
}
}
}
我正在编写一个小 "language" 来创建 javascript 代码。本质上它是 hiding/showing 一些 html 表单元素。但我需要为某些代码添加自定义 javascript 代码,例如在点击事件上做什么。
Action:
'on' eventName=ID 'do' code=CODE
;
terminal BEGIN: "!$";
terminal END: "$!";
terminal CODE:
BEGIN -> END
;
我现在可以用我的语言创建 Eclipse 插件和代码,但字段代码的值包含 BEGIN 和 END 字符。
on eventName do !$
var x = thisIsJavaScript();
console.log(x);
$!
我的价值是:
!$
var x = thisIsJavaScript();
console.log(x);
$!
我只想要中间没有 !$ 和 $! 的部分。
如有任何提示,我们将不胜感激。
非常感谢!
你应该为你的终端规则写一个值转换器
import org.eclipse.xtext.common.services.DefaultTerminalConverters;
import org.eclipse.xtext.conversion.IValueConverter;
import org.eclipse.xtext.conversion.ValueConverter;
import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.nodemodel.INode;
import com.google.inject.Inject;
public class MyDslConverters extends DefaultTerminalConverters {
@Inject
private CODEValueConverter codeValueConverter;
@ValueConverter(rule = "CODE")
public IValueConverter<String> CODE() {
return codeValueConverter;
}
public static class CODEValueConverter implements IValueConverter<String> {
@Override
public String toValue(String string, INode node) throws ValueConverterException {
return string.substring(2, string.length()-2);
}
@Override
public String toString(String value) throws ValueConverterException {
return "!$" + value + "$!";
}
}
}