我正在为 CoffeeScript 编写一个 Eclipse/Xtext 插件,我意识到我可能需要手动为其编写一个词法分析器。 CoffeeScript 解析器还使用手写词法分析器 https://github.com/jashkenas/coffee-script/blob/master/src/lexer.coffee处理语法中的缩进和其他技巧。
Xtext 生成一个扩展的类org.eclipse.xtext.parser.antlr.Lexer
这反过来又延伸了org.antlr.runtime.Lexer
。所以我想我会延长它。我可以看到两种方法
- 覆盖
mTokens()
。这是通过生成的代码来完成的,改变内部状态。
- 覆盖
nextToken()
这似乎是一种自然的方法,但随后我必须跟踪内部状态。
我找不到任何示例如何在没有语法文件的情况下为 ANTLR 编写一个简单的词法分析器。所以最简单的答案是指向一个的指针。
一个答案Xtext:具有重要/语义空白的语言的语法 https://stackoverflow.com/questions/7167834/xtext-grammar-for-language-with-significant-semantic-whitespace指的是todotext http://code.google.com/a/eclipselabs.org/p/todotext/它通过更改底层输入流中的标记来处理缩进问题。我不想走那条路,因为处理咖啡脚本语法的其他技巧会很困难。
UPDATE:
与此同时,我意识到我的问题部分是 Xtext 特定的。
这就是我所做的——而且它有效。
public class MyLexer extends myprj.parser.antlr.internal.InternalMylangLexer {
private SomeExternalLexer externalLexer;
public Lexer(CharStream in) {
super(in);
externalLexer = new SomeExternalLexer(in);
}
@Override
public Token nextToken() {
Token token = null;
ExternalToken extToken = null;
try {
extToken = externalLexer.nextToken();
if (extToken == null) {
token = CommonToken.INVALID_TOKEN;
}
else {
token = mapExternalToken(extToken);
}
}
catch (Exception e) {
token = CommonToken.INVALID_TOKEN;
}
return token;
}
protected Token mapExternalToken(ExternalToken extToken) {
// ...
}
}
然后我有一个稍微定制的解析器,其中包含:
public class BetterParser extends MylangParser {
@Override
protected TokenSource createLexer(CharStream stream) {
MyLexer lexer = new MyLexer(stream);
return lexer;
}
}
我也不得不改变我的MylangRuntimeModule.java
包含这个方法
@Override
public Class<? extends org.eclipse.xtext.parser.IParser> bindIParser() {
return myprj.parser.BetterParser.class ;
}
就是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)