1

Ocamlでクラスのコンパイラをやっています。「1」のようなコマンドまたは式を含むファイルを読み取る必要があり、Int 1 が返されます。同じコードが、私と友人以外のクラス全体で機能しました。誰もが同じバージョンの ocaml と Ubuntu 13.04 を使用しています。エラー: Lexico.Eof

誰かがこれが何であるかについて何か考えがありますか? これは asa.ml です:

type opB =
| Soma
| Sub
| Mul
| Div

type exp =
| Int of int
| Float of float
| String of string
| Char of char
| Identificador of string
| Bin of opB * exp * exp

これは Sintatico.mly です。

%{
open Asa;;
%}

%token <int> INT
%token <float> FLOAT
%token <string> STRING
%token <char> CHAR
%token <string> IDENTIFICADOR
%token APAREN FPAREN PTVIRG
%token MAIS MENOS MUL DIV

%left MAIS MENOS
%left MUL DIV

%start main
%type <Asa.exp> main

%%

main: expr                 { $1 }
;

expr: IDENTIFICADOR         { Identificador($1) }
| INT                       { Int($1) }
| FLOAT                     { Float($1) }
| STRING                    { String($1) }
| CHAR                      { Char($1) }
| APAREN expr FPAREN        { $2 }
| expr MAIS expr            { Bin(Soma, $1, $3) }
| expr MENOS expr           { Bin(Sub, $1, $3) }
| expr MUL expr             { Bin(Mul, $1, $3) }
| expr DIV expr             { Bin(Div, $1, $3) }
;

Lexico.mll:

{
open String
open Sintatico
exception Eof
}

let digito = ['0'-'9']
let caracter = [^ '\n' '\t' '\b' '\r' '\'' '\\']
let identificador = ['a'-'z' 'A'-'Z']['a'-'z' '0'-'9']*

rule token = parse
| [' ' '\t' '\n']   { token lexbuf } (* ignora os espacos *)
| digito+ as inum   { print_string " int ";  INT (int_of_string inum) }
| digito+'.'digito+ as fnum { print_string " float "; FLOAT (float_of_string fnum) }
| '\"' ([^ '"']* as s) '\"' { print_string " string "; STRING (s)}
| '\'' caracter '\'' as ch      { print_string " char "; CHAR (String.get ch 1) }

| identificador as id       { print_string " identificador "; IDENTIFICADOR (id) }

| '('               { print_string " abreparent "; APAREN }
| ')'               { print_string " fechaparent "; FPAREN }

| '+'               { print_string " + "; MAIS }
| '-'               { print_string " - "; MENOS }
| '*'               { print_string " * "; MUL }
| '/'               { print_string " / "; DIV }

| ';'                           { print_string " ptv "; PTVIRG }

| eof               { raise Eof }

carregatudo.ml という名前のファイルを呼び出すコードは次のとおりです。

#load "asa.cmo"
#load "sintatico.cmo"
#load "lexico.cmo"

open Asa;;

let analisa_arquivo arquivo = 
let ic = open_in arquivo in
let lexbuf = Lexing.from_channel ic in
let asa = Sintatico.main Lexico.token lexbuf in
close_in ic;    
asa

ポルトガル語について申し訳ありません:

arquivoはファイルを意味します

Lexico はレクサーを意味します。

Sintatico はパーサーを意味します

最初に、コマンド make interpretador を使用してこの makefile を実行します。

CAMLC = ocamlc
CAMLLEX = ocamllex
CAMLYACC = ocamlyacc

interpretador: asa.cmo sintatico.cmi sintatico.cmo lexico.cmo

portugol: asa.cmo sintatico.cmi sintatico.cmo lexico.cmo principal.cmo

clean:
rm *.cmo *.cmi

# regras genericas
.SUFFIXES: .mll .mly .mli .ml .cmi .cmo .cmx
.mll.mli:
$(CAMLLEX) $<
.mll.ml: 
$(CAMLLEX) $<
.mly.mli:
$(CAMLYACC) $<
.mly.ml:
$(CAMLYACC) $<
.mli.cmi:
$(CAMLC) -c $(FLAGS) $<
.ml.cmo:
$(CAMLC) -c $(FLAGS) $<

次に carregatudo.ml: #use "carregatudo.ml";;

次の関数: analisa_arquivo("teste.pt");;

入力ファイル teste.pt は次のようになります。

1

そしてリターンは

Int 1

しかし、私はエラー Lexico.Eof を取得し続けます

ありがとうございました!

4

1 に答える 1