我正在使用javacc进行一个项目,我有一个问题,需要一些帮助,我在一个文件中有这样的东西:
STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.;我为单词STRING定义了一个令牌,我希望定义另一个令牌(NAME),以获得所有单词COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.
问题是,我有一个标记INTEGER,当它到达单词2003时,它会说(There was an error during the parse. Encountered INTEGER:2003 .)
那么,我如何才能得到"STRING"和";"之间的单词?
谢谢!
发布于 2014-06-07 17:44:37
我将假设您希望<NAME>匹配"STRING“之后和";”之后的所有字符,以及分号本身
您可以使用词法状态来完成此操作。您可以在“常见问题”、“语法文件的描述”和“令牌管理器”中看到它们。
简而言之,令牌管理器产品如下所示
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> }如果分号丢失,则lexer将抛出一个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+ "." ) ; }
)
}https://stackoverflow.com/questions/24093996
复制相似问题