最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

--
← 前のページに戻る

5.1 Closure Basicの構文定義

Closure Basicの構文定義をデカルト言語で書き下してみましょう。 デカルト言語では、このように書いた構文定義はパーサ(構文解析器)として、ほぼそのまま使えます。

では、実際のパーサを示しましょう。 以下のようにデカルト言語では拡張バッカス記法(EBNF)と同様に構文パーサを定義することが出来るのです。


<ClosureBasic>
        <program>
        ;

<program>
        {<sentence> {":" <sentence>} }
        ;

<sentence>
        (<If> | <For> | <While> | <Print> | <InputNum> | <Input>
                | <Return> | <DefArray> | <Gosub>
                | <Assignment> | <Comment> )
        ;

<If>
        "if" <Conditional> "then"
        <program>
        { "else" "if" <Conditional> "then"
          <program>}
        [ "else"
          <program>]
        "end"
        ;

<For>
        "for" <VARIABLE> "=" <Expression> "to" <Expression>
        <program>
        "next"
        ;

<While>
        "while" <Conditional> "do"
        <program>
        "end"
        ;

<Print>
        "print" 
        (
         <CR>
         |
         <Displayitem> {"," <Displayitem>} [";"]
        )
        ;

<Displayitem>
        <Exp_closure> | <Expression> | <Exp_strings>
        ;

<InputNum>
        "input#" [<STRINGS> "," ] <VARIABLE>
        ;

<Input>
        "input" [<STRINGS> "," ] <VARIABLE>
        ;

<Gosub>
        ("gosub" | "call") <Expression>
        ;

<Assignment>
        <VARIABLE> ("=" (<Expression> | <Exp_strings>))
        ;

<Return>
        "return" <Expression>
        ;

<DefArray>
        "dim" <ID> "[" <NUM> "]" { "," <ID> "[" <NUM> "]"}
        ;

<Fun>
        "{" "fun" "(" <FunParm> ")" <program> "}"
        ;

<FunParm>
        [<VARIABLE> {"," <VARIABLE>}]
        ;

<Conditional>
        <cond_or>
        ;

<cond_or>
        <cond_and> { "or" <cond_and>}
        ;

<cond_and>
        <cond> { "and" <cond> }
        ;

<cond>
        "(" <Conditional> ")" | <Compare>
        ;

<Compare>
        <Expression> ( "==" <Expression> | "=" <Expression> |
        "!=" <Expression> | "<>" <Expression> | ">="<Expression> |
        ">" <Expression> | "<=" <Expression> | "<" <Expression> )
        ;

<Exp_strings>
        <StringsTerm> { "+" <StringsTerm> }
        ;

<StringsTerm>
        (<VARIABLE> | <STRINGS>)
        ;

<Expression>
        <expradd>
        ;

<expradd>
        <exprmul> {"+" <exprmul> | "-" <exprmul>}
        ;

<exprmul>
        <exprID> {"*" <exprID> | "/" <exprID>}
        ;

<exprID>
        ("+" <exprterm> | "-" <exprterm> | <exprterm>)
        ;

<exprterm>
        <exprterm2> {"(" <Parm> ")"}
        ;

<Parm>
        [<Expression> {"," <Expression>]]
        ;

<exprterm2>
        ("(" <Expression> ")" | <Fun> | <NUM>
                | <STRINGS> | <Builtin> | <VARIABLE>)
        ;

<Builtin>
        ("random" "(" <Expression> ")")
        ;

<VARIABLE>
        <ID> ["[" <Expression> "]" ]
        ;

<Comment>
        "'" <SKIPCR>
        ;

このパーサにより、Closure Basicの構文は厳密に定義されました。

さらに実際のコンパイラにするには、このパーサに変数管理、スコープ、クロージャ、パラメタおよび命令コード出力処理などを追加することになります。