JAVACC令牌定义

JAVACC令牌定义,java,javacc,Java,Javacc,我正在使用javacc进行一个项目,我遇到了一个问题,需要一些帮助, 我在一个文件中有类似的内容: STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.; 我为单词字符串定义了一个标记,我想定义另一个标记(名称),以获得所有单词版权(C)2003,2004 SYNOPSYS,INC. 问题是我有一个标记INTEGER,当它到达单词2003时,它会说(在解析过程中出错。遇到INTEGER:2003…) 那么我如何才能得到“STRING”和“;” 谢谢大家!

我正在使用
javacc
进行一个项目,我遇到了一个问题,需要一些帮助, 我在一个文件中有类似的内容:

STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.;
我为单词
字符串定义了一个标记,我想定义另一个标记(
名称
),以获得所有单词
版权(C)2003,2004 SYNOPSYS,INC.

问题是我有一个标记
INTEGER
,当它到达单词2003时,它会说(
在解析过程中出错。遇到INTEGER
:2003…)

那么我如何才能得到
“STRING”
“;”


谢谢大家!

我假设您希望
匹配“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> }
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+ "." ) ; }
    )
}
void string():{
令牌t;
} {
t=
(
|
{抛出新的ParserException(“字符串后面必须跟一个\“;\”。在第行”
+t、 beginLine+”,列“+t.beginColumn+”;}
)
}

我假设您希望
匹配“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> }
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+ "." ) ; }
    )
}
void string():{
令牌t;
} {
t=
(
|
{抛出新的ParserException(“字符串后面必须跟一个\“;\”。在第行”
+t、 beginLine+”,列“+t.beginColumn+”;}
)
}

我假设您希望
匹配“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> }
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+ "." ) ; }
    )
}
void string():{
令牌t;
} {
t=
(
|
{抛出新的ParserException(“字符串后面必须跟一个\“;\”。在第行”
+t、 beginLine+”,列“+t.beginColumn+”;}
)
}

我假设您希望
匹配“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> }
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+ "." ) ; }
    )
}
void string():{
令牌t;
} {
t=
(
|
{抛出新的ParserException(“字符串后面必须跟一个\“;\”。在第行”
+t、 beginLine+”,列“+t.beginColumn+”;}
)
}

您是否正在尝试编写Lexer?您使用的是什么jj文件?是的,我正在编写Lexer!!我正在写一个.jj文件。你正在写一个Lexer吗?你在用什么jj文件?是的,我正在写一个Lexer!!我正在写一个.jj文件。你正在写一个Lexer吗?你在用什么jj文件?是的,我正在写一个Lexer!!我正在写一个.jj文件。你正在写一个Lexer吗?你在用什么jj文件?是的,我正在写一个Lexer!!我正在写一个.jj文件注意,这将消耗下一个分号的所有字符,包括换行符和换行符。注意,这将消耗下一个分号的所有字符,包括换行符和换行符。注意,这将消耗下一个分号的所有字符,包括换行符和换行符。请注意,这将消耗下一个分号的所有字符,包括换行符和换行符。