파서 문제의 바닥을 찾으려고하지만 시작하려면 왜 이런 일이 발생하는지 알고 싶습니다.
Encountered "" at line 1, column 1.
Was expecting one of:
문제를 일으키는 문법의 하위 집합은 다음과 같습니다.
options {
STATIC = false;
DEBUG_PARSER = true;
DEBUG_LOOKAHEAD = true;
LOOKAHEAD = 64;
}
PARSER_BEGIN(MyParser)
package myparser;
public class MyParser {
}
PARSER_END(MyParser)
/* skip whitespace */
SKIP : {
" "
| "\t"
| "\n"
| "\r"
}
/* other symbols */
TOKEN : {
< COMMA: "," >
| < SEMICOLON: ";" >
| < LEFT_PAREN: "(" >
| < RIGHT_PAREN: ")" >
| < LEFT_BRACKET: "[" >
| < RIGHT_BRACKET: "]" >
| < LEFT_BRACE: "{" >
| < RIGHT_BRACE: "}" >
}
/* type specifiers */
TOKEN : {
< TYPE_SPECIFIER:
"void"
| "int"
| "float"
>
}
/* identifiers */
TOKEN [IGNORE_CASE] : {
<IDENTIFIER: ["_","a"-"z"] (["_","a"-"z","0"-"9"])* >
}
SimpleNode Start() : {}
{
/* begin here */
Declaration()
{ return jjtThis; }
}
void Declaration() : {}
{
FunctionPrototype() <SEMICOLON>
| InitDeclaratorList() <SEMICOLON>
}
void FunctionPrototype() : {}
{
FunctionDeclarator() <RIGHT_PAREN>
}
void FunctionDeclarator() : {}
{
FunctionHeaderWithParameters()
| FunctionHeader()
}
void FunctionHeaderWithParameters() : {}
{
/* recursive version:
FunctionHeader() ParameterDeclaration()
FunctionHeaderWithParameters() <COMMA> ParameterDeclaration()
*/
FunctionHeader() ParameterDeclaration() [FunctionHeaderWithParametersPrime()]
}
void FunctionHeaderWithParametersPrime() : {}
{
<COMMA> ParameterDeclaration() [FunctionHeaderWithParametersPrime()]
}
void FunctionHeader() : {}
{
FullySpecifiedType() <IDENTIFIER> <LEFT_PAREN>
}
void FullySpecifiedType() : {}
{
TypeSpecifier()
}
void TypeSpecifier() : {}
{
TypeSpecifierNonArray() [ArraySpecifier()]
}
void ArraySpecifier() : {}
{
/* recursive version:
<LEFT_BRACKET> <RIGHT_BRACKET>
| <LEFT_BRACKET> ConstantExpression() <RIGHT_BRACKET>
| ArraySpecifier() <LEFT_BRACKET> <RIGHT_BRACKET>
| ArraySpecifier() <LEFT_BRACKET> ConstantExpression() <RIGHT_BRACKET>
*/
<LEFT_BRACKET> <RIGHT_BRACKET> [ArraySpecifierPrime()]
}
void ArraySpecifierPrime() : {}
{
<LEFT_BRACKET> <RIGHT_BRACKET> [ArraySpecifierPrime()]
}
void TypeSpecifierNonArray() : {}
{
<TYPE_SPECIFIER>
| TypeName()
}
void TypeName() : {}
{ /* user defined type e.g struct or typedef */
<IDENTIFIER>
}
void ParameterDeclaration() : {}
{
ParameterDeclarator()
| ParameterTypeSpecifier()
}
void ParameterTypeSpecifier() : {}
{
TypeSpecifier()
}
void ParameterDeclarator() : {}
{
TypeSpecifier() <IDENTIFIER>
| TypeSpecifier() <IDENTIFIER> ArraySpecifier()
}
void InitDeclaratorList() : {}
{
/* recursive version:
SingleDeclaration()
| InitDeclaratorList() <COMMA> <IDENTIFIER>
| InitDeclaratorList() <COMMA> <IDENTIFIER> ArraySpecifier()
| InitDeclaratorList() <COMMA> <IDENTIFIER> ArraySpecifier() <EQUAL> Initializer()
| InitDeclaratorList() <COMMA> <IDENTIFIER> <EQUAL> Initializer()
*/
SingleDeclaration() [InitDeclaratorListPrime()]
}
void InitDeclaratorListPrime() : {}
{
<COMMA> <IDENTIFIER> [InitDeclaratorListPrime()]
| <COMMA> <IDENTIFIER> ArraySpecifier() [InitDeclaratorListPrime()]
}
void SingleDeclaration() : {}
{
FullySpecifiedType()
| FullySpecifiedType() <IDENTIFIER>
| FullySpecifiedType() <IDENTIFIER> ArraySpecifier()
}
함수 선언이 잘 작동합니다.
void main(int a, int b);
그러나 전체 문법에서 함수 본문에 들어가는 선언문은 작동하지 않습니다.
float myvar;
이 깨진 예제에 대한 파서 및 미리보기의 디버그 출력은 다음과 같습니다.
Call: Start
Call: Declaration
Call: FunctionPrototype(LOOKING AHEAD...)
Call: FunctionDeclarator(LOOKING AHEAD...)
Call: FunctionHeaderWithParameters(LOOKING AHEAD...)
Call: FunctionHeader(LOOKING AHEAD...)
Call: FullySpecifiedType(LOOKING AHEAD...)
Call: TypeSpecifier(LOOKING AHEAD...)
Call: TypeSpecifierNonArray(LOOKING AHEAD...)
Visited token: <<TYPE_SPECIFIER>: "float" at line 1 column 1>; Expected token: <<TYPE_SPECIFIER>>
Return: TypeSpecifierNonArray(LOOKAHEAD SUCCEEDED)
Call: ArraySpecifier(LOOKING AHEAD...)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <"[">
Return: ArraySpecifier(LOOKAHEAD FAILED)
Return: TypeSpecifier(LOOKAHEAD SUCCEEDED)
Return: FullySpecifiedType(LOOKAHEAD SUCCEEDED)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <<IDENTIFIER>>
Visited token: <";" at line 1 column 12>; Expected token: <"(">
Return: FunctionHeader(LOOKAHEAD FAILED)
Return: FunctionHeaderWithParameters(LOOKAHEAD FAILED)
Call: FunctionHeader(LOOKING AHEAD...)
Call: FullySpecifiedType(LOOKING AHEAD...)
Call: TypeSpecifier(LOOKING AHEAD...)
Call: TypeSpecifierNonArray(LOOKING AHEAD...)
Visited token: <<TYPE_SPECIFIER>: "float" at line 1 column 1>; Expected token: <<TYPE_SPECIFIER>>
Return: TypeSpecifierNonArray(LOOKAHEAD SUCCEEDED)
Call: ArraySpecifier(LOOKING AHEAD...)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <"[">
Return: ArraySpecifier(LOOKAHEAD FAILED)
Return: TypeSpecifier(LOOKAHEAD SUCCEEDED)
Return: FullySpecifiedType(LOOKAHEAD SUCCEEDED)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <<IDENTIFIER>>
Visited token: <";" at line 1 column 12>; Expected token: <"(">
Return: FunctionHeader(LOOKAHEAD FAILED)
Return: FunctionDeclarator(LOOKAHEAD FAILED)
Return: FunctionPrototype(LOOKAHEAD FAILED)
Call: InitDeclaratorList(LOOKING AHEAD...)
Call: SingleDeclaration(LOOKING AHEAD...)
Call: FullySpecifiedType(LOOKING AHEAD...)
Call: TypeSpecifier(LOOKING AHEAD...)
Call: TypeSpecifierNonArray(LOOKING AHEAD...)
Visited token: <<TYPE_SPECIFIER>: "float" at line 1 column 1>; Expected token: <<TYPE_SPECIFIER>>
Return: TypeSpecifierNonArray(LOOKAHEAD SUCCEEDED)
Call: ArraySpecifier(LOOKING AHEAD...)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <"[">
Return: ArraySpecifier(LOOKAHEAD FAILED)
Return: TypeSpecifier(LOOKAHEAD SUCCEEDED)
Return: FullySpecifiedType(LOOKAHEAD SUCCEEDED)
Return: SingleDeclaration(LOOKAHEAD SUCCEEDED)
Call: InitDeclaratorListPrime(LOOKING AHEAD...)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <",">
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <",">
Return: InitDeclaratorListPrime(LOOKAHEAD FAILED)
Return: InitDeclaratorList(LOOKAHEAD SUCCEEDED)
Visited token: <<IDENTIFIER>: "myvar" at line 1 column 7>; Expected token: <";">
Return: Declaration
Return: Start
Encountered "" at line 1, column 1.
Was expecting one of:
문제는 SingleDeclaration
프로덕션에있는 것 같습니다.
FullySpecifiedType()
| FullySpecifiedType() <IDENTIFIER>
여기서는 FullySpecifiedType
유형 상수 ( void , int , float ) 또는 다른 식별자 (사용자 정의 유형을 용이하게하기 위해)입니다.
이 줄을 바꾸면
FullySpecifiedType() <IDENTIFIER>
| FullySpecifiedType()
그런 다음 의도 한대로 작동합니다. 주문이 차이를 만드는 이유는 무엇입니까?
먼저 LOOAHEAD 옵션을 1로 설정하여 JavaCC가 미리보기 충돌에 대해 경고하도록합니다.
문법에 미리보기 충돌이 있습니다. JavaCC 프로세서는이를 경고로보고해야합니다. 이러한 경고에주의해야합니다.
기본적으로 JavaCC는 다음 입력 토큰을 사용하여 선택합니다. 자세한 내용은 설명서 및 FAQ 를 참조하십시오. 취하다
void SingleDeclaration() : {}
{
FullySpecifiedType()
| FullySpecifiedType() <IDENTIFIER>
| FullySpecifiedType() <IDENTIFIER> ArraySpecifier()
}
예로서. 세 가지 방법을 선택할 수 있습니다. 첫 번째 선택을 시작할 수있는 모든 토큰도 두 번째 또는 세 번째를 시작할 수 있기 때문에 선택은 분명히 다음 토큰의 종류를 기준으로 할 수 없습니다.
문제를 해결하는 방법에는 두 가지가 있습니다. 일반적으로 가장 좋은 방법은 문법을 다시 작성하는 것입니다.
void SingleDeclaration() : {}
{
FullySpecifiedType()
[
<IDENTIFIER>
[
ArraySpecifier()
]
]
}
두 번째는 미리보기 사양을 사용하는 것입니다.
void SingleDeclaration() : {}
{
LOOKAHEAD(FullySpecifiedType() <IDENTIFIER> "[")
FullySpecifiedType() <IDENTIFIER> ArraySpecifier()
|
LOOKAHEAD(FullySpecifiedType() <IDENTIFIER>)
FullySpecifiedType() <IDENTIFIER>
|
FullySpecifiedType()
}
한 가지 더, 시작 프로덕션은 다음과 같아야합니다.
SimpleNode Start() : {}
{
/* begin here */
Declaration() <EOF>
{ return jjtThis; }
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다