1

我有一条规则需要用户提供一个字符串。目前,当用户给出我在语法中定义的关键字时,解析器会给出分段错误。

例如:

sampleClause: calc! strName {##->setType(SAMPLE_CLAUSE);};
strName : STRING;
calc: "CALC" | "calc";

如果用户输入 calc/CALC 作为 strName,解析器会抛出 Seg Fault。我不确定如何避免这种情况。

编辑:我也想知道如何避免解析器给出分段错误。这会使我不想要的应用程序崩溃。我想在这些情况下优雅地退出而不是段错误。

PS:我需要 ANTLR 2 中的解决方案,因为存在依赖关系。

4

1 回答 1

0

这里通常的解决方案是修改strName为歪斜所有关键字

strName : STRING | calc ;

假设您有一堆关键字,您希望将它们中的每一个定义为词法分析器标记并创建一个keywords规则。

calc: CALC;
CALC: "Calc" | "calc";
FOO: "foo";
BAR: "bar";

keywords: CALC| FOO | BAR;

strName: STRING | keywords;

您可能还想在keywords匹配时将令牌类型更改为字符串。我忘记了如何在 ANTLR 2 中做到这一点,但它相当简单。

于 2016-03-31T11:46:14.460 回答