質問

私はクライアントが非常に基本的なコードを作成できるようにするソリューションを構築しています。今では基本的な構文検証を行っていますが、可変検証に固執しています。

JslintがJavaScriptを使用してこれを行うことを知っています。

たとえば、ユーザーがコードを書いたとします

moose = "barry"
base = 0
if(moose == "barry"){base += 100}

次に、「if」式が正しい構文にある、可変ムースが初期化されたなどの場合などを明確にする方法を見つけようとしていますが、文字でキャラクターをスキャンせずにこれを行いたいのですが、コードはミニ言語です。このアプリケーションのためだけに構築されているため、非常に基本的なものであり、メモリなどを管理する必要はありません。

私は最初にキャリッジリターン、そしてスペースで分割することを考えていましたが、ユーザーが次のようなものを書かないと言うものは何もありません moose="barry" また if(moose=="barry")そして、ユーザーが条件のインラインの結果を維持しないと言うものは何もありません。

明らかに、コンパイラーと通訳者はこれをはるかに広範なスケールで行いますが、キャラクターごとにそれを行うかどうかはわかりません。

(他のオプションは、PHPに送り返してプロセスを送信して、責任のブラウザをリリースすることです)

助言がありますか?

ありがとう

ユースケースは制限されています。この場合、構文は拡張されません。言語は、ユーザーの入力に基づいてクライアントが一意のコストを作成できるようにするための単純なスクリプト言語であり、最終結果は計算に関係なくPHPによって処理されます。エンドユーザーによって調整できず、一貫性があることを確認することはできません。

たとえば、基本コストが1.00ポンドであり、「追加コスト」と呼ばれるフォームにフィールドがあるとすると、言語は「追加コスト」フィールドに比べて基本コストを操作できるようにします。

それで

base = 1;
if(additional > 100 && additional < 150){base += 50}
elseif(additional == 150){base *= 150}
else{base += additional;}

これは、言語がどのように使用されるかの基本的な例です。


すべての回答をありがとう、私はパーサーを調査し、1000のコードラインでいくつかのテストを実行した場合、1つを作成する必要があるよりもはるかに複雑になり、そのキャラクターがそのキャラクターでさえ数秒かかることがあることがわかりました。 512MBのメモリを持つ単一のコアP4(顧客が使用するよりもはるかに少ない)

情報をチェックし、変数などを有効なPHPコードに変換するPHPベースの構文チェッカーを構築することにしました(補強せずに後で呼び出す準備ができているため)JavaScriptの代わりにこれはより適切と思われます検証プロセスを妨げることなく、より複雑なコードが発生する可能性があります

1時間しかかからず、IFステートメントの有効性を確認できるコードがあり、ネストされたIF、スペース、または奇妙な表現によって混同されていません。ずっと時間がかかったでしょう

あなたは皆私に考えるべきことをたくさん与えてくれました、そして私は関連する答えを評価しましたありがとう

役に立ちましたか?

解決

もし、あんたが 本当 これをやりたい - それによって、私はあなたが本当にあなたのソフトウェアを適切かつ予測可能に動作させたいなら、奇妙な「これをしない」特別なケースを持っていないことを意味します - あなたはあなたのために本当のパーサーを書く必要があります言語。それを手に入れると、言語のプログラムをデータ構造に変換できます。そのデータ構造を使用すると、少なくとも使用法と定義使用チェーン分析と呼ばれる手順を含む、コードのあらゆる種類の分析を実行できます。

アプリケーションである程度のスクリプトを可能にする「プログラミング言語」を作成すると、どんなに些細なことであっても、誰かが最終的に驚くほど大きなプログラムを書くでしょう。

JavaScriptパーサーを生成する容易に利用できるパーサージェネレーターはわかりません。再帰的な降下パーサーは書くのがそれほど難しくありませんが、維持するのがugいになる可能性があり、構文を拡張するのが少し難しくなります(特に、元のバージョンをあまり経験していない場合は)。

他のヒント

あなたは見たいかもしれません JS/CC これは、javaScriptでグラマー用のパーサーを生成するパーサージェネレーターです。 BNFとEBNFを使用して言語を説明する方法を把握する必要があります。また、JS/CCには、文法を指定するための独自の構文(実際のBNF/EBNFにやや近い)があります。 Grammerを考えると、JS/CCはその文法のパーサーを生成します。

Pointyが言ったように、あなたの他の選択肢は、あなた自身のlexerと再帰的なdescentなパーサーをゼロから書くことです。 BNF/EBNFを手に入れると、それほど難しくありません。私は最近、JavaScriptのEBNFからパーサーを書きました(文法は非常に単純だったので、1つのYMMVを書くのはそれほど難しくありませんでした)。

それが「クライアント固有」であるというあなたのコメントに対処するため。また、ここに自分の経験を追加します。スクリプト言語とスクリプト環境を提供している場合、実際のパーサーよりも良いルートはありません。

IF-Elsesの束を通して特別なケースを処理することは、恐ろしく痛みを伴い、メンテナンスの悪夢になります。私が大学の新入生だったとき、私は自分の言語を書こうとしました。これは、私が再帰的に沈黙するパーサー、または一般的なパーサーについて何かを知る前でした。コードをトークンに分解できることを自分で考えました。そこから、私はIF-Elsesの束を使用して非常に扱いにくいパーサーを書き、またスペースや他のキャラクター(まさに説明したもの)でトークンを分割しました。最終結果はひどいものでした。

再帰的な出生パーサーについて読んだら、私は自分の言語の文法を書き、オリジナルのパーサーを書くのにかかった10時間でパーサーを簡単に作成しました。真剣に、あなたが自分自身に多くの痛みを救いたいなら、 実際 パーサー。現在のルートを下ると、問題を永久に修正することになります。あなたは、人々が間違った場所にスペースを置く場合、またはおそらく彼らがあまりにも多く(または1つの少ない)スペースを持っているケースを処理する必要があります。他の唯一の選択肢は、非常に剛性のある構造を提供することです(つまり、あなたは持っている必要があります まさに Xこの声明に続くスペース数)これは、スクリプト環境を非常に魅力的ではないようにする可能性があります。実際のパーサーは、これらすべての問題を自動的に修正します。

JavaScriptには関数「Eval」があります。

var code = 'alert(1);';
eval(code);

アラートが表示されます。 「評価」を使用して基本コードを実行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top