gpt4 book ai didi

JavaCC 换行符可能会导致解析问题

转载 作者:行者123 更新时间:2023-11-30 02:15:33 27 4
gpt4 key购买 nike

我的语法如下:

PARSER_BEGIN(Parser)
package parser;
public class Parser {}
PARSER_END(Parser)

SKIP: {
" "
| "\t"
| "\n"
| "\r"
| "\f"
}

TOKEN : {
<MIX: "mix">
| <WITH: "with">
| <FUNCTION: "function">
| <MANIFEST: "manifest">
| <REPEAT: "repeat">
| <NAT: "nat">
| <REAL: "real">
| <MAT: "mat">
| <FOR: "for">
| <INSTRUCTIONS: "instructions">
}

TOKEN : {
<LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <COLON: ":">
| <ASSIGN: "=">
}

// Include the necessary <INTEGER_LITERAL> included in most examples

TOKEN : {
<IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)*>
// Letter and Digit are the unicode values.
}

void Program() :
{}
{
( Manifest() )*
<INSTRUCTIONS>
Statement()
<EOF>
}

void Manifest() :
{}
{
<MANIFEST> (Type())? PrimaryExpression()
}

void Statement() :
{}
{
Instruction()
| Function()
}

void Instruction() :
{}
{
(TypingList())* Identifier() <ASSIGN> Expression()
}

void TypingList() :
{}
{
Type() ( TypingRest() )*
}

void TypingRest() :
{}
{
<COMMA> Type()
}

void Type() :
{}
{
<MAT>
| <NAT>
| <REAL>
}

void Function() :
{}
{
<FUNCTION> Identifier() <LPAREN> (FormalParameterList())* <RPAREN> (<COLON> TypingList())? <LBRACE>
Statement()
<RBRACE>
}

void FormalParemeterList() :
{}
{
FormalParameter() (FormalParameterRest() )*
}

void FormalParameter() :
{}
{
(TypingList())* Identifier()
}

void FormalParameterRest() :
{}
{
<COMMA> FormalParameter()
}

void Instruction() :
{}
{
(TypingList())* Identifier() <ASSIGN> Expression()
}

void Identifier() :
{}
{
<IDENTIFIER>
}

void Expression() :
{}
{
<MIX> Identifier() <WITH> Identifier() <FOR> <INTEGER_LITERAL>
}

这应该使我能够解析一个简单的程序,例如:

manifest itemOne
manifest itemTwo

instructions

function doThis(argument) : nat {
temp = mix one with two for 3
}

two = mix item3 with item4

但是,当 JavaCC 看到 temp = mix... 时函数中的语句doThis ,它声明它找到了一个标识符,但实际上还期待其他任何东西: Exception in thread "main" parser.ParseException: Encountered " <IDENTIFIER> "temp "" at line x, column y.
Was expecting one of:
"for" ...
"}" ...

但是,正如您所看到的,我的语法表明您可以使用标识符为其分配 mix 的值。 。但错误表明这是无效或不正确的。我已经尝试了几种变体,但似乎没有任何效果。

最佳答案

问题在于,您告诉 JavaCC 只有一个 Instruction()|BranchStatement()|WhileStatement()|Function()。因此,一旦解析器访问这些状态之一,它就无法再访问那里。

为了解决这个问题,请将 Kleene Closure + 放在 Statement() 转换周围,例如:

void Statement() :
{}
{
(
Instruction()
| BranchStatement()
| WhileStatement()
| Function()
)+
}

+ 运算符告诉自动机必须至少访问此状态一次,但可以重复。

关于JavaCC 换行符可能会导致解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48591569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com