我试图开发JavaScript中的UI,以解析我的Antlr4语法中所述的特定代码。我使用访客来解析代码的所有部分并生成问卷。之后,根据用户以JavaScript形式的输入,我解析了代码的最后一部分以生成结果(它接近了ANTLR书籍中起草的计算机制)。到目前为止,一切都很好。但是,我想以JavaScript形式修改输入,并第二次解析以再生和重新计算一些结果。目前,AST树变为空。我试图重新启动解析器,访客是创建解析器的新实例。似乎以前的解析器和Lexer仍然活跃,不可能"将光标移动"再次解析我的源代码的特定块。感谢您的宝贵帮助。克里斯
以下摘要文件和脚本。grammar.g4
pre
: title ('n')+
author ('n')+
;
peri
: (statement ('n')+)*
(answer ('n')+)*
;
post
: (feedback ('n')+)*
;
exercise
: pre peri post
;
//End of Grammar
JavaScript主类:
class MyExercise {
constructor(){
this.chars = antlr4.CharStreams.fromBuffer(input,'utf-8');
this.lexer = new MyLexer(this.chars);
this.tokens = new antlr4.CommonTokenStream(this.lexer);
this.parser = new MyParser(this.tokens);
this.visitor = new LabeledVisitor(this.exercise,this.parser);
this.parser.buildParseTrees = true;
tree = this.parser.pre();
this.visitor.visitPre(tree);
tree = this.parser.peri();
this.visitor.visitPeri(tree);
this.generateAnswersHTML() // generate HTML results and also inputfields to collect values from user.
this.generateSubmitButton(); // generate submit HTML button
}
generateSubmitButton(){
var button = document.createElement('input');
button.setAttribute('type','submit');
button.setAttribute('value','Check answer');
button.addEventListener("click",this.checkAnswers.bind(this));
document.getElementById("answer").appendChild(button);
}
checkAnswers(object){
var tree = this.parser.post();
this.visitor.visitPost(tree);
this.generateFeeback(); //Generate HTML feedbacks (function of inputed values by user)
}
}
它第一次运行良好,但是当我再次单击"调用checkanswer()方法的按钮checkanswer时,树变为空。
有两种方法可以使您的输入重新制作:
- 每次重新创建输入流,令牌源 解析器。
-
通过
重置您的输入流和令牌源- 重新创建您的输入流或将新文本加载到现有文本中。
- call parser.reset()。
- 在令牌源中再次设置您的输入流(要重置它,只需调用.reset()不会剪切)即可。
lexer.setInputStream(input);
- 出于同样的原因,再次将您的令牌源设置在令牌流中。
tokens.setTokenSource(lexer);