JavaCC는 아무것도 기대하지 않고 아무것도 찾지 못했습니다.

사용자 3703887

파서 문제의 바닥을 찾으려고하지만 시작하려면 왜 이런 일이 발생하는지 알고 싶습니다.

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()

그런 다음 의도 한대로 작동합니다. 주문이 차이를 만드는 이유는 무엇입니까?

Theodore Norvell

먼저 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Scala HashMap # contains는 아무것도 기대하지 않습니다.

분류에서Dev

nginx는 아무것도 기록하지 않습니다.

분류에서Dev

JPanel에 그리기는 아무것도하지 않습니다.

분류에서Dev

For 루프는 아무것도 기록하지 않습니다.

분류에서Dev

Android Bluetooth Discovery는 아무것도 기록하지 않습니다.

분류에서Dev

Mongoose 참조로 찾기는 아무것도 반환하지 않습니다.

분류에서Dev

awk는 왜 여기서 아무것도하지 않습니까?

분류에서Dev

고양이는 아무것도 보여주지 않는다

분류에서Dev

Django select_related는 아무것도하지 않습니다.

분류에서Dev

Plotly Library는 아무것도 표시하지 않습니다.

분류에서Dev

미디어 소스는 아무것도하지 않습니다

분류에서Dev

Laravel 관계는 아무것도 반환하지 않습니다.

분류에서Dev

React 함수는 아무것도 반환하지 않습니다.

분류에서Dev

npm start는 Windows에서 아무것도하지 않습니다.

분류에서Dev

Console.SetError (myTextWriter)는 아무것도하지 않습니다.

분류에서Dev

memcpy는 아무것도하지 않습니다

분류에서Dev

beautifulsoup4는 아무것도 인쇄하지 않습니다.

분류에서Dev

django makemessages는 아무것도하지 않습니다.

분류에서Dev

Mongoose Populate는 아무것도하지 않습니다.

분류에서Dev

Bash Script는 아무것도하지 않습니다.

분류에서Dev

jQuery ajax 오류는 아무것도하지 않습니다.

분류에서Dev

jQuery ajax 오류는 아무것도하지 않습니다.

분류에서Dev

코드는 아무것도 반환하지 않습니다.

분류에서Dev

PreparedStatement는 아무것도 변경하지 않습니다.

분류에서Dev

gem install rails는 아무것도하지 않습니다

분류에서Dev

grep * gcc *는 아무것도 일치하지 않습니다

분류에서Dev

Phalcon Debug는 아무것도하지 않습니다.

분류에서Dev

GetResource는 아무것도 표시하지 않습니다.

분류에서Dev

htmlentities ()는 아무것도 반환하지 않습니다.

Related 관련 기사

  1. 1

    Scala HashMap # contains는 아무것도 기대하지 않습니다.

  2. 2

    nginx는 아무것도 기록하지 않습니다.

  3. 3

    JPanel에 그리기는 아무것도하지 않습니다.

  4. 4

    For 루프는 아무것도 기록하지 않습니다.

  5. 5

    Android Bluetooth Discovery는 아무것도 기록하지 않습니다.

  6. 6

    Mongoose 참조로 찾기는 아무것도 반환하지 않습니다.

  7. 7

    awk는 왜 여기서 아무것도하지 않습니까?

  8. 8

    고양이는 아무것도 보여주지 않는다

  9. 9

    Django select_related는 아무것도하지 않습니다.

  10. 10

    Plotly Library는 아무것도 표시하지 않습니다.

  11. 11

    미디어 소스는 아무것도하지 않습니다

  12. 12

    Laravel 관계는 아무것도 반환하지 않습니다.

  13. 13

    React 함수는 아무것도 반환하지 않습니다.

  14. 14

    npm start는 Windows에서 아무것도하지 않습니다.

  15. 15

    Console.SetError (myTextWriter)는 아무것도하지 않습니다.

  16. 16

    memcpy는 아무것도하지 않습니다

  17. 17

    beautifulsoup4는 아무것도 인쇄하지 않습니다.

  18. 18

    django makemessages는 아무것도하지 않습니다.

  19. 19

    Mongoose Populate는 아무것도하지 않습니다.

  20. 20

    Bash Script는 아무것도하지 않습니다.

  21. 21

    jQuery ajax 오류는 아무것도하지 않습니다.

  22. 22

    jQuery ajax 오류는 아무것도하지 않습니다.

  23. 23

    코드는 아무것도 반환하지 않습니다.

  24. 24

    PreparedStatement는 아무것도 변경하지 않습니다.

  25. 25

    gem install rails는 아무것도하지 않습니다

  26. 26

    grep * gcc *는 아무것도 일치하지 않습니다

  27. 27

    Phalcon Debug는 아무것도하지 않습니다.

  28. 28

    GetResource는 아무것도 표시하지 않습니다.

  29. 29

    htmlentities ()는 아무것도 반환하지 않습니다.

뜨겁다태그

보관