我试图用JavaScript开发UI来解析ANTLR4语法中描述的特定代码。我使用访客来解析代码的所有部分并生成调查表。然后,根据用户以JavaScript形式输入的内容,我解析代码的最后一部分以生成结果(它接近于ANTLR书中起草的计算器机制)。到目前为止,一切都很好。尽管如此,我还是想修改JavaScript表单中的输入,并再次解析以重新生成并重新计算一些结果。此时,AST树变为空。我试图重新初始化语法分析器,例如访问器,以创建语法分析器的新实例。似乎以前的解析器和词法分析器仍处于活动状态,并且不可能“向上移动光标”以再次解析我的源代码的特定块。 感谢您的宝贵帮助。 克里斯
在摘要文件和脚本下面。 语法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按钮时,树变为空。
答案 0 :(得分:0)
有两种方法可以重新解析您的输入:
通过
重置输入流和令牌源lexer.setInputStream(input);
tokens.setTokenSource(lexer);