首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVACC令牌定义

JAVACC令牌定义
EN

Stack Overflow用户
提问于 2014-06-07 05:24:58
回答 1查看 2.7K关注 0票数 0

我正在使用javacc进行一个项目,我有一个问题,需要一些帮助,我在一个文件中有这样的东西:

代码语言:javascript
复制
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"";"之间的单词?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-06-07 17:44:37

我将假设您希望<NAME>匹配"STRING“之后和";”之后的所有字符,以及分号本身

您可以使用词法状态来完成此操作。您可以在“常见问题”、“语法文件的描述”和“令牌管理器”中看到它们。

简而言之,令牌管理器产品如下所示

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

然后,解析器的生成可以如下所示:

代码语言:javascript
复制
void string() : {} { <STRING> <NAME> }

如果分号丢失,则lexer将抛出一个TokenManagerError

编辑:若要获得更好的错误消息,在分号丢失的情况下,您可以执行以下操作。

代码语言:javascript
复制
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 } 

然后,解析器的生成可以如下所示:

代码语言:javascript
复制
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+ "." ) ; }
    )
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24093996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档