1

Sblime text 2の構文定義に非常に興味があります

私は基本を勉強しましたが、RE(およびルール)の書き方がわかりませ variable = sentensemyvar = func(foo, bar) + baz

^\s*([^=\n]+)=([^=\n]+\n)(それはうまくいかない)よりも良いものは書けない この RE を適切な方法で書くには?

また、ブロックのREを定義するのにいくつかの困難があります

IF i FROM .. TO ..
    ...
ELSE
    ...
END IF

それを書くのは鍬ですか?

4

1 に答える 1

3

この場合、パーサーを作成する必要があります。パターンが異なる可能性があるため、正規表現は機能しません。「変数 = 文」と述べたときに、すでにお気づきでしょう。このために、文法定義に spoofax または javacup を使用できます。JavaCup の一部を紹介します。

スキャナの問題: 「変数」がパターン (_|[a-zA-Z])(_|[a-zA-Z])* に従い、「数値」が ([0-9])+ であるとします。 number は任意の 10 進数または int にすることができますが、ここでは、私の言語が整数 (またはそのパターンが意味するものは何でも :) のみを扱うと仮定して、そのパターンとして述べます。

これで、JavaCUP 構文に従って文法を宣言できます。多かれ少なかれ似ています:

式 ::= 変数 "=" 文

文 ::= 文 "+" 文;
文 ::= 文 "-" 文;
文 ::= 文 "*" 文;
文 ::= 文 "/" 文;

文 ::= 数字;

...そして、それはさらに続きます。

コンパイラのクラスをまったく使用したことがない場合、非常にわかりにくいと思われるかもしれません。さらに、どちらを使用しているか (RL または LL) に応じて、パーサーで無限ループを回避するための多くの文法上の制限があります。

とにかく、あなたの質問に対する本当の答えは次のとおりです。正規表現だけではやりたいことができないので、もっと概念が必要です。

于 2012-11-23T03:06:53.580 に答える