나는 완전히 아이디어가 없습니다. 나는 이것에 매일 자유로운 분을 소비한다, 그러나 나는 아이디어에서 완전하게이다.파서 중지 중반 구문
이 내 Ocamlyacc
문법입니다 :
input: /* empty */ { }
| input stmt { }
stmt:
extern { print_endline "Got an extern import" }
| func { print_endline "Got function definition" }
| call { print_endline "Got function call" }
extern:
EXTERN proto { Extern $2 }
func:
DEF proto expr { Function ($2, $3) }
proto:
IDENTIFIER LPAREN id_list RPAREN { print_endline "Got prototype definition"; Prototype ($1, $3) }
id_list:
/* empty */ { [] }
| IDENTIFIER { [$1] }
| id_list COMMA IDENTIFIER { $3 :: $1 }
expr_list:
/* empty */ { [] }
| expr { [$1] }
| expr_list COMMA expr { $3 :: $1 }
expr:
call { $1 }
| expr OP expr { Binary ($2, $1, $3) }
| IDENTIFIER { Variable $1 }
| NUMBER { Number $1 }
| LPAREN expr RPAREN { $2 }
call:
IDENTIFIER LPAREN expr_list RPAREN { Call ($1, $3) }
나는 그것이 디버그 메시지에 따라, 기능 및 프로토 타입 선언을 가지고 말해해야 def foo(a,b) a+b
를 분석 시작합니다. 대신에, 나는 단지 proto
규칙을 파싱 할 때 메시지를 받는다.
추가 디버그 메시지는 a
의 a+b
까지 파서가 중단되었음을 보여줍니다. 오류 메시지가 없으며 그 밖의 것은 없습니다. stmt
의 규칙 중 하나를 충족하지 않고 전체 텍스트 모자가 완전히 구문 분석 된 것처럼 멈 춥니 다.
시프트/축소 오류 또는 이와 유사한 오류가 없습니다. AST 유형도 문제가 아닙니다. 나는 더 이상 모른다, 어쩌면 다른 누군가는 도울 수있다. 분명히 그것은 명백한 것이지만 나는 그것을 볼 수 없다. 호평 렉서 :
편집
{
open Parser
}
rule token = parse
| [' ' '\t' '\n'] { token lexbuf }
| "def" { DEF }
| "extern" { EXTERN }
| "if" { IF }
| "then" { THEN }
| "else" { ELSE }
| ['+' '-' '*' '/'] as c { OP c }
| ['A'-'Z' 'a'-'z'] ['A'-'Z' 'a'-'z' '0'-'9' '_']* as id { IDENTIFIER id }
| ['0'-'9']*'.'['0'-'9']+ as num { NUMBER (float_of_string num) }
| '(' { LPAREN }
| ')' { RPAREN }
| ',' { COMMA }
| '#' { comment lexbuf }
| _ { raise Parsing.Parse_error }
| eof { raise End_of_file }
and comment = parse
| '\n' { token lexbuf }
| _ { comment lexbuf }
꽤 괜찮아 보입니다. 확실히 명백한 아무것도. lexxer? – nlucaroni