JFlex/JavaCup Parser: Как проанализировать преднамеренные пробельные символы?

У меня проблема с анализом двух оставшихся программ. Я думаю, что моя проблема в том, что, возможно, в двух конкретных местах есть пробелы, которые я не знаю, как игнорировать во время разбора? Я включил две программы-примера.

Я попытался включить YYINITIAL для " " с символом WHITESPACE, но я предполагаю, что вы не можете этого сделать, поэтому я получил эту ошибку?

Может ли кто-нибудь помочь мне с тем, что я делаю неправильно? Программа синтаксического анализа 1 выдает мне ошибку: текущий токен #2 Синтаксическая ошибка вместо ожидаемых классов токенов [] Программа синтаксического анализа 2 выдает мне ошибку: текущий токен #12 Синтаксическая ошибка вместо ожидаемых классов токенов [EQUAL]

Спецификация JavaCup:

import java_cup.runtime.*;
import java.io.*;

terminal NUMBER;
terminal VOID, INT, RETURN, MAIN, IF, FOR, PLUS, MINUS, GRTHAN, LSTHAN, TIMES, SEMI, COMMA, LPAR, RPAR, LBRA, RBRA, EQUAL, PRINTF, HASH, ID, QUOTES, COMMENTS, INLINECOMMENTS;

non terminal Integer program;
non terminal type, methodDecl, formalParams, formalParam, block, statement, localVarDecl, forStmt, ifStmt, assignStmt, returnStmt, expression, multiplicativeExpr, primaryExpr, actualParams, printStmt;

precedence nonassoc  PLUS, MINUS, GRTHAN, LSTHAN, TIMES, INT, RETURN, ID, LPAR, LBRA, VOID, IF, FOR, PRINTF;

program ::=methodDecl program:e {: RESULT =e+1; :}
        |methodDecl {: RESULT = 1; :}
        ;

type ::=INT|VOID;

methodDecl ::= type MAIN LPAR RPAR block
        |type MAIN LPAR formalParams RPAR block
        |type MAIN ID LPAR RPAR block
        |type ID LPAR RPAR block
        |type MAIN ID LPAR formalParams RPAR block
        |type ID LPAR formalParams RPAR block
        ;

formalParams ::=formalParam COMMA formalParams
        |formalParam
        ;

formalParam ::= type ID
        |type
        ;

block ::= LBRA statement RBRA
       ;

statement ::=statement statement
        |block
        |localVarDecl
        |ifStmt
        |forStmt
        |assignStmt
        |returnStmt
        |printStmt
        ;

localVarDecl ::= type ID SEMI
        |type ID COMMA localVarDecl
        |type assignStmt
        |ID SEMI
        |ID COMMA localVarDecl
        ;

ifStmt ::= IF LPAR expression RPAR block
        ;

forStmt ::= FOR LPAR statement RPAR
         ;

assignStmt ::= ID EQUAL expression SEMI
        |ID EQUAL expression COMMA assignStmt
        |ID EQUAL expression TIMES expression
        ;

returnStmt ::= RETURN expression SEMI
        ;

printStmt ::= PRINTF LPAR QUOTES COMMA ID RPAR SEMI
        |PRINTF LPAR QUOTES COMMA actualParams RPAR SEMI
        ;

expression ::= multiplicativeExpr
        |multiplicativeExpr PLUS expression
        |multiplicativeExpr MINUS expression
        |multiplicativeExpr TIMES expression
        |multiplicativeExpr GRTHAN expression
        |multiplicativeExpr LSTHAN expression
        |multiplicativeExpr PLUS PLUS
        ;

multiplicativeExpr ::= primaryExpr
        ;

primaryExpr ::= ID LPAR actualParams RPAR
        |LPAR expression RPAR
        |ID LPAR RPAR
        |QUOTES
        |NUMBER
        |ID
        ;

actualParams ::=expression COMMA actualParams
        |expression
        ;

Спецификация JFlex:

import java_cup.runtime.*;
import java.util.*;
import java.io.*;
import java.lang.System;

%%

%function next_token
%class A4Scanner
%cup

%eofval{
          return null;
%eofval}
%state COMMENTS, INLINECOMMENTS, HASH


ID = [a-zA-Z_][a-zA-Z0-9_][0-9a-zA-Z_]*
NUMBER = -?[0-9]+(\.[0-9]+)?([eE][\-\+][0-9]+)?

%%

<YYINITIAL>"void"       { return new java_cup.runtime.Symbol( A4Symbol.VOID); }
<YYINITIAL>"int"        { return new java_cup.runtime.Symbol( A4Symbol.INT); }
<YYINITIAL>"return"     { return new java_cup.runtime.Symbol( A4Symbol.RETURN); }
<YYINITIAL>"main"       { return new java_cup.runtime.Symbol( A4Symbol.MAIN); }
<YYINITIAL>"if"         { return new java_cup.runtime.Symbol( A4Symbol.IF); }
<YYINITIAL>"for"        { return new java_cup.runtime.Symbol( A4Symbol.FOR); }
<YYINITIAL>"+"          { return new java_cup.runtime.Symbol( A4Symbol.PLUS); }
<YYINITIAL>"-"          { return new java_cup.runtime.Symbol( A4Symbol.MINUS); }
<YYINITIAL>">"          { return new java_cup.runtime.Symbol( A4Symbol.GRTHAN); }
<YYINITIAL>"<"          { return new java_cup.runtime.Symbol( A4Symbol.LSTHAN); }
<YYINITIAL>"*"          { return new java_cup.runtime.Symbol( A4Symbol.TIMES); }
<YYINITIAL>";"          { return new java_cup.runtime.Symbol( A4Symbol.SEMI); }
<YYINITIAL>","          { return new java_cup.runtime.Symbol( A4Symbol.COMMA); }
<YYINITIAL>"("          { return new java_cup.runtime.Symbol( A4Symbol.LPAR); }
<YYINITIAL>")"          { return new java_cup.runtime.Symbol( A4Symbol.RPAR); }
<YYINITIAL>"{"          { return new java_cup.runtime.Symbol( A4Symbol.LBRA); }
<YYINITIAL>"}"          { return new java_cup.runtime.Symbol( A4Symbol.RBRA); }
<YYINITIAL>"="          { return new java_cup.runtime.Symbol( A4Symbol.EQUAL); }
<YYINITIAL>"printf"     { return new java_cup.runtime.Symbol( A4Symbol.PRINTF); }
<YYINITIAL>{ID}         { return new java_cup.runtime.Symbol( A4Symbol.ID); }
<YYINITIAL>{NUMBER}     { return new java_cup.runtime.Symbol( A4Symbol.NUMBER); }
<YYINITIAL>\"[^\"]*\"   { return new Symbol( A4Symbol.QUOTES); }

<YYINITIAL>"/*" {yybegin(COMMENTS);}
<COMMENTS>"*/" {yybegin(YYINITIAL); }
<COMMENTS>{ID}|{NUMBER}|<QUOTES> {}

<YYINITIAL>"//" {yybegin(INLINECOMMENTS);}
<INLINECOMMENTS>"\r"|"\n" {yybegin(YYINITIAL); }
<INLINECOMMENTS>{ID}|{NUMBER}|<QUOTES> {}

<YYINITIAL>"#" {yybegin(HASH);}
<HASH>"\r"|"\n" {yybegin(YYINITIAL); }
<HASH>{ID}|{NUMBER}|<QUOTES> {}

\r|\n {/* Do nothing */}
. {/* Do nothing */}

Код

/* Program 1
*/
#include <stdio.h>

int 1func(int num1, int num2)
{
    int result = 0;
    result = num1*num1 - num2*num2;
    return result;
}

int main(void)
{
    int num1 = 5, num2 = 6, result = 0;
    if (num1>num2)
    {
        result = func1(num1, );
        printf("Result is %d.", result);
    }
    return 0;
}
---------------------------------------------------------------------
/* Program 2
*/
#include <stdio.h>

int main(void)
{
    int i = 0, multi = 1;
    for (i = 0; i< 10; i++)
        printf("%d %d\n", i, i*i);
    return 0;
}

0 ответов

Другие вопросы по тегам