gpt4 book ai didi

javascript - ANTLR4 JavaScript 解析器 : how to catch an error in parsing

转载 作者:行者123 更新时间:2023-11-30 20:32:35 27 4
gpt4 key购买 nike

我在 ANTLR4 中有一个语法,我正在围绕它编写一个应用程序。相关语法的片段如下所示:

grammar SomeGrammar;
// ... a bunch of other parse rules
operand
: id | literal ;
id
: ID ;
literal
: LITERAL ;
// A bunch of other lexer rules
LITERAL : NUMBER | BOOLEAN | STRING;
NUMBER : INTEGER | FLOAT ;
INTEGER : [0-9]+ ;
FLOAT : INTEGER '.' INTEGER | '.' INTEGER ;
BOOLEAN : 'TRUE' | 'FALSE' ;
ID : [A-Za-z]+[A-Za-z0-9_]* ;
STRING : '"' .*? '"' ;

我像这样生成 antlr4 JavaScript Lexer 和 Parser:

$ antlr4 -o . -Dlanguage=JavaScript -listener -visitor

然后我重载 exitLiteral () 原型(prototype)以检查操作数是否为文字。问题是,如果我通过

a

它(强制)将它解析为文字,并抛出一个错误(例如下面用 grun 显示的):

$ grun YARL literal -gui -tree
a
line 1:0 mismatched input 'a' expecting LITERAL
(literal a)

当我使用像这样重载的 JavaScript 解析器时出现同样的错误:

SomeGrammarLiteralPrinter.prototype.exitLiteral = function (ctx) {
debug ("Literal is " + ctx.getText ()); // Literal is a
};

我想捕获错误,以便确定它是一个 ID,而不是一个 LITERAL。我该怎么做?

感谢任何帮助。

最佳答案

更好的解决方案是调整语法,使其准确描述开始时的预期语法:

startRule : ruleA ruleB EOF ;
ruleA : something operand anotherthing ;
ruleB : id assign literal ;

operand : ID | LITERAL ;
id : ID ;
literal : LITERAL ;

解析器从 startRule 开始对解析器规则执行自上而下的图形评估。也就是说,解析器将按顺序评估列出的 startRule 元素,按顺序降序通过命名的子规则(以及那些子规则)。因此,ruleA 不会遇到/考虑 idliteral 规则。

在这个有限的示例中,operandidliteral 规则看似重叠的定义没有冲突。

更新

OperandContext 类将包含返回 TerminalNodeID()LITERAL() 方法。不返回 null 的表示在该特定上下文中实际匹配的符号。查看生成的代码。

关于javascript - ANTLR4 JavaScript 解析器 : how to catch an error in parsing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184935/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com