現時点では、私のフロントエンドは、、、、などの通常の式を解析できます123
。以下は関連するコードです。"abcd"
"=123"
"=TRUE+123"
(* in `syntax.ml`: *)
and expression =
| E_integer of int
| E_string of string
(* in `parser.mly`: *)
expression:
| INTEGER { E_integer $1 }
| STRING { E_string $1 }
ここで、パーサーを改良して、で始まる文字列に出会ったときに、=
それをリテラル文字列ではなく数式として評価しようとします。したがってsyntax.ml
、次のようになります。
(* in `syntax.ml`: *)
and expression =
| E_integer of int
| E_string of string
| E_formula of formula
and formula =
| F_integer of int
| F_boolean of bool
| F_Add of formula * formula
問題は、変更方法がわからないことです。parser.mly
これを試しましたが、機能しませんでした(This expression has type string but an expression was expected of type Syntax.formula
):
(* in `parser.mly`: *)
expression:
| INTEGER { E_integer $1 }
| STRING {
if String.sub $1 1 1 <> "="
then E_string $1
else E_formula (String.sub $1 2 ((String.length $1) - 1)) }
パーサーに通知する方法がわかりません。で始まる文字列の=
場合、次のルールに基づいてさらに解析する必要がありますformula
...誰か助けてもらえますか?
のコメントに続いてgasche
:
フォーミュラ用のパーサーが必要であることに同意します。ここで問題となるのはlexer.mll
、数式用に別のものが必要かどうかです。プログラム全体を一度だけlexするのは論理なので、私はそうしないことを望みますね。また、数式の文法を既存のものに直接追加することはできparser.mly
ますか?
現在lexer.mll
、私は持っています:
let STRING = double_quote ([^ '\x0D' '\x0A' '\x22'])* double_quote
rule token = parse
| STRING as s { STRING s }
私はここで直接何かをすることができると思います:
let STRING = double_quote ([^ '\x0D' '\x0A' '\x22'])* double_quote
let FORMULA_STRING = double_quote = ([^ '\x0D' '\x0A' '\x22'])* double_quote
rule token = parse
| FORMULA_STRING as fs { XXXXX }
| STRING as s { STRING s }
別々に持っている場合、その場所に何を書くべきかわからないのですが、そうXXXXX
すべきですか?数式を含むすべての文法を含むものだけを持っている場合はどうなりますか?Parser_formula.formula token fs
parser_formula.mly
parser.mly