Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javacc中,如何使用令牌分配进行多选令牌_Java_Compiler Construction_Javacc - Fatal编程技术网

在javacc中,如何使用令牌分配进行多选令牌

在javacc中,如何使用令牌分配进行多选令牌,java,compiler-construction,javacc,Java,Compiler Construction,Javacc,代码优先: // I need, but not allowed o = (<I_EXIT> | <I_RET> | <I_NOP>) // Work around, the generated code will do double switch (o = <I_EXIT> | o = <I_RET> | o = <I_NOP>) // Work around, introduce new token, will wa

代码优先:

// I need, but not allowed
o = (<I_EXIT> | <I_RET> | <I_NOP>)

// Work around, the generated code will do double switch
(o = <I_EXIT> | o = <I_RET> | o = <I_NOP>)

// Work around, introduce new token, will warning
// Warning: Line 59, Column 11: Regular Expression choice : XXX can never be matched as : XXX
// Consider this is a bad practice.
TOKEN:{
    <I_NO_OP: <I_EXIT> | <I_RET> | <I_NOP>>
}
o = <I_NO_OP>

// Work around, introduce new grammar, generate double switch with one more function call, looks awful.
Token oneOp():{
    Token t = null;
}{
    (t = <I_CALL> |t = <I_PUSH> |t = <I_POP> |t = <I_JPC>){return t;}
}
...
o = oneOp() a = operand()
//我需要,但不允许
o=(| |)
//变通一下,生成的代码会做双切换
(o=| o=| o=)
//解决问题,引入新令牌,将发出警告
//警告:第59行第11列:正则表达式选项:XXX永远不能匹配为:XXX
/认为这是一个糟糕的做法。
代币:{
}
o=
//变通一下,引入新语法,再调用一个函数生成双开关,看起来很糟糕。
标记oneOp():{
令牌t=null;
}{
(t=| t=| t=| t=){返回t;}
}
...
o=oneOp()a=操作数()

(o=| o=| o=)
看起来好多了。还有别的办法吗?我不确定这样做对不对

整个jjt是

(o=| o=| o=)
这是一个合理的解决办法

因为从语法的角度来看,这三个标记是完全可互换的,所以您也可以这样定义一种标记

TOKEN:{
    <I_NO_OP: "EXIT" | "RET" | "NOP">
}
令牌:{
}

在这种情况下,您不会定义
I_EXIT
I_RET
I_NOP

是否有不允许第一个选项的特殊原因?编译错误
org.javacc.jjtree.ParseException:遇到“”(“”@Acapulco Here
o
是一个标记变量,
(| |)
是语法正则表达式。这个特定的正则表达式只匹配长度为1的令牌序列。但是,一般来说,正则表达式可以匹配任何长度的令牌序列。因此,对令牌变量的赋值仅限于终端符号的情况。如果定义令牌
,则类型为我不会是
I\u EXIT
等。但现在我不使用kind
I\u EXIT…
总之。没错。你说的“现在”对我来说意味着你将来可能需要为这三个关键字使用单独的标记类型。如果是这样的话,
o=|o=
方法是你最好的选择。
(o = <I_EXIT> | o = <I_RET> | o = <I_NOP>)
TOKEN:{
    <I_NO_OP: "EXIT" | "RET" | "NOP">
}