この場合、パーサーを作成する必要があります。パターンが異なる可能性があるため、正規表現は機能しません。「変数 = 文」と述べたときに、すでにお気づきでしょう。このために、文法定義に spoofax または javacup を使用できます。JavaCup の一部を紹介します。
スキャナの問題: 「変数」がパターン (_|[a-zA-Z])(_|[a-zA-Z])* に従い、「数値」が ([0-9])+ であるとします。 number は任意の 10 進数または int にすることができますが、ここでは、私の言語が整数 (またはそのパターンが意味するものは何でも :) のみを扱うと仮定して、そのパターンとして述べます。
これで、JavaCUP 構文に従って文法を宣言できます。多かれ少なかれ似ています:
式 ::= 変数 "=" 文
文 ::= 文 "+" 文;
文 ::= 文 "-" 文;
文 ::= 文 "*" 文;
文 ::= 文 "/" 文;
文 ::= 数字;
...そして、それはさらに続きます。
コンパイラのクラスをまったく使用したことがない場合、非常にわかりにくいと思われるかもしれません。さらに、どちらを使用しているか (RL または LL) に応じて、パーサーで無限ループを回避するための多くの文法上の制限があります。
とにかく、あなたの質問に対する本当の答えは次のとおりです。正規表現だけではやりたいことができないので、もっと概念が必要です。