파스칼 하위 세트에 대한 파서를 작성하기 위해 Javacc과 협력하고 있습니다. Javacc 파서 생성기가 제 언어를 인식하지 못합니다 (입력)
이
내 코드입니다 :PARSER_BEGIN(Pascal)
import java.io.*;
public class Pascal {
public static void main(String args[]) throws ParseException,IOException {
Pascal parser = new Pascal(new FileInputStream(args[0]));
parser.Programa();
}
}
PARSER_END(Pascal)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
TOKEN :
{
<PROGRAM: "program">
| <INTEIRO: "integer">
| <REAL: "real">
| <VAR: "var">
| <OF: "of">
| <FUNCTION: "function">
| <PROCEDURE: "procedure">
| <LBRACE:"(">
| <RBRACE: ")">
| <SEMI: ";">
| <PTS: ":">
| <BEGIN: "begin">
| <END: "end">
| <ATRIB: ":=">
| <ARRAY: "array">
| <LBRACKETS: "[">
| <RBRACKETS: "]">
| <IF: "if">
| <THEN: "then">
| <ELSE: "else">
| <NOT: "not">
| <PLUS: "+">
| <MINUS: "-">
| <WHILE: "while">
| <DO: "do">
}
TOKEN :
{
<OPERADOR_MULTIPLICATIVO: ("*"|"/"|"div"|"mod"|"and")>
|
<OPERADOR_ADITIVO: ("+"| "-" | "or")>
|
<OPERADOR_RELACIONAL: ("=" | "<>" | "<" | "<=" | ">=" | ">")>
|
<ID: ["a"-"z","A"-"Z"] (["a"-"z","A"-"Z","0"-"9"])*>
|
<DIGT: ["0"-"9"] (["0"-"9"])*>
}
void Programa() :
{}
{ <PROGRAM> <ID> <LBRACE> Lista_de_identificadores() <RBRACE> <SEMI>
Declaracoes()
Declara_subprogram()
Enunciado_composto()
<EOF>
}
// lista_de_identificadores
void Lista_de_identificadores():
{}
{
<ID> Lista2()
}
void Lista2():
{}
{
("," <ID> Lista2())?
}
//declarações
void Declaracoes():
{}
{
(<VAR> Lista_de_identificadores() <PTS> Tipo() <SEMI>)*
}
// tipo
void Tipo():
{}
{
(Tipo_padrao() | <ARRAY> <LBRACKETS> <DIGT> <RBRACKETS> <OF> Tipo_padrao())
}
//tipo_padrao
void Tipo_padrao():
{}
{
(<INTEIRO> | <REAL>)
}
//declarações_de_subprogramas
void Declara_subprogram():
{}
{
(Subprogram() <SEMI>)*
}
//declaração_de_subprograma
void Subprogram():
{}
{
Cabecalho_subprogram()
Declaracoes()
Enunciado_composto()
}
//cabeçalho_de_subprograma
void Cabecalho_subprogram():
{}
{
(<FUNCTION> <ID> Argumentos() <PTS> Tipo_padrao() <SEMI>) | (<PROCEDURE> <ID> Argumentos())
}
//argumentos
void Argumentos():
{}
{
(<LBRACE> Lista_parametros() <RBRACE>)?
}
//lista_de_parâmetros
void Lista_parametros():
{}
{
Lista_de_identificadores() <PTS> Tipo() Lista_parametros2()
}
void Lista_parametros2():
{}
{
(<SEMI> Lista_de_identificadores() <PTS> Tipo() Lista_parametros2())?
}
//enunciado_composto
void Enunciado_composto():
{}
{
<BEGIN> Enunciados_opcionais() <END>
}
//enunciados_opcionais
void Enunciados_opcionais():
{}
{
(Lista_enunciados())?
}
//lista_de_enunciados
void Lista_enunciados():
{}
{
Enunciado() (<SEMI> Enunciado())*
}
void Enunciado():
{}
{
LOOKAHEAD(5)(Variavel() <ATRIB> Expressao()) | (Chamada_procedimento()) | (Enunciado_composto()) | (<IF> Expressao() <THEN> Enunciado() <ELSE> Enunciado()) | (<WHILE> Expressao() <DO> Enunciado())
}
void Variavel():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACKETS> Expressao() <RBRACKETS>)
}
void Chamada_procedimento():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACE> Lista_expressoes() <RBRACE>)
}
void Lista_expressoes():
{}
{
Expressao() Lista_expressoes2()
}
void Lista_expressoes2():
{}
{
("," Expressao() Lista_expressoes2())?
}
void Expressao():
{}
{
LOOKAHEAD(2)Expressao_simples() | Expressao_simples() <OPERADOR_RELACIONAL> Expressao_simples()
}
void Expressao_simples():
{}
{
LOOKAHEAD(3)(Termo() Expressao_simples2()) | (Sinal() Termo() Expressao_simples2())
}
void Expressao_simples2():
{}
{
(<OPERADOR_ADITIVO> Termo() Expressao_simples2())?
}
void Termo():
{}
{
Fator() Termo2()
}
void Termo2():
{}
{
(<OPERADOR_MULTIPLICATIVO> Fator() Termo2())?
}
void Fator():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACE> Lista_expressoes() <RBRACE>) | (<DIGT>) | (<LBRACE> Expressao() <RBRACE>) | (<NOT> Fator())
}
void Sinal():
{}
{
(<PLUS> | <MINUS>)
}
그리고 이것은 입력 프로그램입니다 :
문제가Exception in thread "main" ParseException: Encountered " <OPERADOR_RELACIONAL> "= "" at line 5, column 14.
Was expecting one of:
"then" ...
<OPERADOR_MULTIPLICATIVO> ...
<OPERADOR_ADITIVO> ...
<OPERADOR_MULTIPLICATIVO> ...
<OPERADOR_ADITIVO> ...
<OPERADOR_ADITIVO> ...
<OPERADOR_MULTIPLICATIVO> ...
<OPERADOR_ADITIVO> ...
at Pascal.generateParseException(Pascal.java:984)
at Pascal.jj_consume_token(Pascal.java:865)
at Pascal.Enunciado(Pascal.java:270)
at Pascal.Lista_enunciados(Pascal.java:235)
at Pascal.Enunciados_opcionais(Pascal.java:223)
at Pascal.Enunciado_composto(Pascal.java:211)
at Pascal.Subprogram(Pascal.java:137)
at Pascal.Declara_subprogram(Pascal.java:127)
at Pascal.Programa(Pascal.java:20)
at Pascal.main(Pascal.java:9)
, 나는 이해할 수 없다 :
program exemplo (input, output, test);
var x, y: integer;
function mdc (a, b: integer): integer;
begin
if b = 0 then mdc := a
else mdc := mdc (b, a mod b)
end;
begin
read(x, y);
write(mdc(x,y));
end;
JavaCC에이 반환 왜 Javacc는 그 주장을 기대하고 있으며 그가 그 위치에 "="잘못을 부른 것입니다.
void Enunciado():
{}
{
LOOKAHEAD(5)(Variavel() <ATRIB> Expressao()) | (Chamada_procedimento()) | (Enunciado_composto()) | (<IF> Expressao() <THEN> Enunciado() <ELSE> Enunciado()) | (<WHILE> Expressao() <DO> Enunciado())
}
void Variavel():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACKETS> Expressao() <RBRACKETS>)
}
void Chamada_procedimento():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACE> Lista_expressoes() <RBRACE>)
}
void Lista_expressoes():
{}
{
Expressao() Lista_expressoes2()
}
void Lista_expressoes2():
{}
{
("," Expressao() Lista_expressoes2())?
}
void Expressao():
{}
{
LOOKAHEAD(2)Expressao_simples() | Expressao_simples() <OPERADOR_RELACIONAL> Expressao_simples()
}
void Expressao_simples():
{}
{
LOOKAHEAD(3)(Termo() Expressao_simples2()) | (Sinal() Termo() Expressao_simples2())
}
void Expressao_simples2():
{}
{
(<OPERADOR_ADITIVO> Termo() Expressao_simples2())?
}
void Termo():
{}
{
Fator() Termo2()
}
void Termo2():
{}
{
(<OPERADOR_MULTIPLICATIVO> Fator() Termo2())?
}
void Fator():
{}
{
LOOKAHEAD(2)(<ID>) | (<ID> <LBRACE> Lista_expressoes() <RBRACE>) | (<DIGT>) | (<LBRACE> Expressao() <RBRACE>) | (<NOT> Fator())
}
누군가가 오류가 어디 알아낼 수 :이 especific 상황에 직장에서 부분이 하나의 (거의 전체 코드)인가? 나는 많은 것을 시도했지만이 권리는 이제 나에게 좋게 보인다 (실제로는 그렇지 않다). 감사합니다. .
편집 : 동일한 이름이지만 최종 번호가 2 인 함수는 왼쪽 재귀를 제거하기 위해 만들어집니다.
은 아마 어떻게 든 Expressao의이 짧은 옵션 대신 Expressao_simples의 Expressao_simples을()() 소요 Expressao_simples() 내다 문제? .. 또는 Expressao_simples의 종료 절() 즉,이 순전히으로 ErrorMessage를 기반으로 . 그것은 간단한 op (여전히 Expressaosimples()) 또는 THEN (표현 블록의 끝)을 기대합니다. –