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;
}