是否需要参数
Requiring or not a parameter
我在 Java 8.
上使用 JavaCC
我有以下 BNF 表格:
Program -> ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
用下面的词法分析器
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > }
TOKEN : { < FUNCTION_DEF : "DEF" > }
TOKEN : { < FUNCTION_NAME : ( ["A"-"Z"] )+ > }
TOKEN : { < PARAMATER_NAME : ( ["a"-"z"] )+ > }
TOKEN : { < OPEN_B : "{" > }
TOKEN : { < CLOSE_B : "}" > }
TOKEN : { < SPACE : " " > }
作为输入,我有以下内容:
DEF ABC x { x+1 }
DEF MAIN { ABC(1) }
我的解析器抛出解析错误,因为它显然需要参数名称。仅当函数名称不是 MAIN 时,我如何设法要求参数名称?
谢谢
您可以考虑为 MAIN
函数定义一个单独的表达式,然后将其作为可选部分添加到程序的定义中:
Program -> ( MainDefinition )? ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
MainDefinition -> ( FUNCTION_DEF ) "MAIN" ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
编辑
要允许 MAIN
位于其他函数定义的开头、结尾或中间,您可以像这样更改 Program
表达式
Program -> ( Definition )* ( MainDefinition )? ( Definition )* EOF
您可以将参数设为可选,如果缺少参数且函数名称不是 MAIN,则报错。
void definition() :
{
Token t ;
}
{ <FUNCTION_DEF>
t=<FUNCTION_NAME>
(
<PARAMETER_NAME>
|
{if( ! "MAIN".equals( t.image ) ) {
throw new ParseException( "parameter name is required" ) ;
}
)
"{"
functionBody() ;
"}"
}
您还可以使用语义先行
void definition() :
{
Token t ;
}
{ <FUNCTION_DEF>
t=<FUNCTION_NAME>
(
LOOKAHEAD( { "MAIN".equals( t.image ) } )
(<PARAMETER_NAME>)?
|
<PARAMETER_NAME>
)
"{"
functionBody() ;
"}"
}
我在 Java 8.
上使用 JavaCC我有以下 BNF 表格:
Program -> ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
用下面的词法分析器
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > }
TOKEN : { < FUNCTION_DEF : "DEF" > }
TOKEN : { < FUNCTION_NAME : ( ["A"-"Z"] )+ > }
TOKEN : { < PARAMATER_NAME : ( ["a"-"z"] )+ > }
TOKEN : { < OPEN_B : "{" > }
TOKEN : { < CLOSE_B : "}" > }
TOKEN : { < SPACE : " " > }
作为输入,我有以下内容:
DEF ABC x { x+1 }
DEF MAIN { ABC(1) }
我的解析器抛出解析错误,因为它显然需要参数名称。仅当函数名称不是 MAIN 时,我如何设法要求参数名称?
谢谢
您可以考虑为 MAIN
函数定义一个单独的表达式,然后将其作为可选部分添加到程序的定义中:
Program -> ( MainDefinition )? ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
MainDefinition -> ( FUNCTION_DEF ) "MAIN" ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
编辑
要允许 MAIN
位于其他函数定义的开头、结尾或中间,您可以像这样更改 Program
表达式
Program -> ( Definition )* ( MainDefinition )? ( Definition )* EOF
您可以将参数设为可选,如果缺少参数且函数名称不是 MAIN,则报错。
void definition() :
{
Token t ;
}
{ <FUNCTION_DEF>
t=<FUNCTION_NAME>
(
<PARAMETER_NAME>
|
{if( ! "MAIN".equals( t.image ) ) {
throw new ParseException( "parameter name is required" ) ;
}
)
"{"
functionBody() ;
"}"
}
您还可以使用语义先行
void definition() :
{
Token t ;
}
{ <FUNCTION_DEF>
t=<FUNCTION_NAME>
(
LOOKAHEAD( { "MAIN".equals( t.image ) } )
(<PARAMETER_NAME>)?
|
<PARAMETER_NAME>
)
"{"
functionBody() ;
"}"
}