0

私は自分の言語を Pegjs で書いています。いつものように、私の言語には、、、、などのtrueキーワードfalseifありelseますtoday。今、変数を宣言したいのですが、変数名を予約済みのキーワードにすることはできないようです。language キーワードを除いて、任意の英字の後に英数字を続けることができます。

私は次のことを行いました(Pegjs Onlineでテスト可能):

variable = c:(alpha alphanum*)
{
 var keywords = ["true", "false", "if", "else", "today"];

  var res = c[0]
  for (var i = 0; i<c[1].length; i++) {
    res=res+c[1][i]
  }

  if(keywords.indexOf(res)>=0) {
    return error('\'' + res + '\'' + ' is a keyword and cannot be used as a variable name.');
  }

  return { 'dataType' : 'variable', 'dataValue' : res };
}

alpha = [a-zA-Z]
alphanum = [a-zA-Z0-9_]

boolean = v: ("true" / "false")
{
  return { 'dataType' : 'boolean', 'dataValue': v};
}

trueは違法ですが、true1そうではありません。これで問題ありません。しかし、boolean自分の言語の別の場所で構造を定義したので、定義内の許可されていないキーワードを手動で再定義する代わりに、その定義を再利用することはできませんvariableか?

私のソリューションがエラーを起こしやすい理由を想像できます。私はいくつかのことを試しましたが、うまくいきませんでした。

ご協力いただきありがとうございます!

4

1 に答える 1

1

簡単な答え:

( http://peg.arcanis.fr/2VbQ5G/でこのコードの動作を参照してください)

    variable = ! keyword (alpha alphanum*)
    {
      return { 'dataType' : 'variable', 'dataValue': text()};
    }

    keyword = "true" / "false" / "if" / "else" / "today"

    alpha = [a-zA-Z]
    alphanum = [a-zA-Z0-9_]

    boolean = ("true" / "false")
    {
      return { 'dataType' : 'boolean', 'dataValue': text()};
    }

注: これにより、役立つエラー レポートが失われます。機会があれば、それを保持する答えを出そうとします。

以下のコードの重要な部分は、variableルールの先頭にあります: ! keyword. これは、パーサーが 1 トークン先を見ているため、これを理解する最も簡単な方法です。見つかったものがキーワードでない場合、ルールはトークンとの一致を試みることができます。一方、それキーワードである場合は、式 (および拡張により、ルール! keyword全体が失敗します。variable

David Majda のドキュメントを引用するには:

! 表現

表現に合わせてみてください。一致が成功しなかった場合は、単に undefined を返し、パーサーの位置を進めません。それ以外の場合は、一致が失敗したと見なします。

于 2015-01-12T16:04:39.127 に答える