2011-11-03 83 views
2

我的fsyacc代碼給出了一個編譯器錯誤,說沒有找到變量,但我不知道爲什麼。我希望有人能指出這個問題。爲什麼這個fsyacc輸入產生F#不能編譯?

%{ 
open Ast 
%} 


// The start token becomes a parser function in the compiled code: 
%start start 

// These are the terminal tokens of the grammar along with the types of 
// the data carried by each token: 
%token NAME 
%token ARROW TICK VOID 
%token LPAREN RPAREN 
%token EOF 

// This is the type of the data produced by a successful reduction of the 'start' 
// symbol: 
%type <Query> start 

%% 

// These are the rules of the grammar along with the F# code of the 
// actions executed as rules are reduced. In this case the actions 
// produce data using F# data construction terms. 
start: Query { Terms($1) } 

Query: 
    | Term EOF     { $1 } 

Term: 
    | VOID      { Void } 
    | NAME      { Conc($1) } 
    | TICK NAME     { Abst($2) } 
    | LPAREN Term RPAREN  { Lmda($2) } 
    | Term ARROW Term   { TermList($1, $3) } 

該行| NAME {濃度($ 1)}和下面的線均可以得到這樣的錯誤:

error FS0039: The value or constructor '_1' is not defined 

我理解的語法問題,但什麼是錯的YACC輸入?

如果有幫助,這裏是AST的定義:

namespace Ast 
open System 

type Query = 
    | Terms of Term 

and Term = 
    | Void 
    | Conc of String 
    | Abst of String 
    | Lmda of Term 
    | TermList of Term * Term 

而且fslex輸入:

{ 
module Lexer 
open System 
open Parser 
open Microsoft.FSharp.Text.Lexing 

let lexeme lexbuf = 
    LexBuffer<char>.LexemeString lexbuf 
} 

// These are some regular expression definitions 
let name = ['a'-'z' 'A'-'Z' '0'-'9'] 
let whitespace = [' ' '\t' ] 
let newline = ('\n' | '\r' '\n') 

rule tokenize = parse 
| whitespace { tokenize lexbuf } 
| newline  { tokenize lexbuf } 
// Operators 
| "->"   { ARROW } 
| "'"   { TICK } 
| "void"  { VOID } 
// Misc 
| "("   { LPAREN } 
| ")"   { RPAREN } 
// Numberic constants 
| name+         { NAME } 
// EOF 
| eof { EOF } 

回答

4

這不是FsYacc的錯。 NAME是一個無價值的標誌。

你想要做這些修正:

%token NAME%token <string> NAME

| name+ { NAME }| name+ { NAME (lexeme lexbuf) }

現在一切都應該編譯。