gpt4 book ai didi

JAVACC token 定义

转载 作者:行者123 更新时间:2023-12-01 12:52:53 26 4
gpt4 key购买 nike

我正在使用 javacc 开发一个项目,我遇到问题并需要一些帮助,我的文件中有这样的内容:

STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.;

我为单词 STRING 定义了一个标记,并且我想定义另一个标记 (NAME) 来获取所有单词 COPYRIGHT (C) 2003, 2004 SYNOPSYS 公司。

问题是我有一个 token INTEGER ,当它到达单词 2003 时,它会显示(解析期间发生错误。遇到 INTEGER : 2003 .. .)

那么我该如何获取 "STRING"";" 之间的单词

谢谢!

最佳答案

我假设你想要 <NAME>匹配“STRING”之后和“;”之前的所有字符还有分号本身

您可以使用词汇状态来做到这一点。您可以在FAQ中阅读有关它们的信息。 , the description of the grammar file ,以及 token manager minitutorial .

简而言之,代币管理器的制作看起来像这样

TOKEN: { <STRING: "STRING" > : AFTERSTRING } // When "STRING" is encountered, switch to state AFTERSTRING
<AFTERSTRING> TOKEN : { <NAME: (~[";"])* ";" > : DEFAULT} // After the ";", return to the DEFAULT state.

解析器的生成如下所示:

void string() : {} { <STRING> <NAME> }

如果缺少分号,词法分析器将抛出 TokenManagerError .

<小时/>

编辑:为了在缺少分号的情况下获得更好的错误消息,您可以执行以下操作。

TOKEN: { <STRING: "STRING" > : AFTERSTRING } // When "STRING" is encountered, switch to state AFTERSTRING
<AFTERSTRING> TOKEN : { <NAME: (~[";"])* ";" > : DEFAULT} // After the ";", return to the DEFAULT state.
<AFTERSTRING> TOKEN : { <MISSING_SEMI: ~[] > : DEFAULT }

解析器的生成如下所示:

void string() : {
Token t ;
} {
t = <STRING>
(
<NAME>
|
<MISSING_SEMI>
{throw new ParserException( "STRING must be followed by a \";\". at line"
+t.beginLine+ ", column " +t.beginColumn+ "." ) ; }
)
}

关于JAVACC token 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093996/

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