1

独自の文法を開発するために、P::RD チュートリアルの文法をテストしています。文字列宣言を出力し、その前に「$」を追加する方法がわかりません。たとえば、「STRING sDir」は「$sDir」と出力する必要があります。$string =~ s/STRING /\$/ を実行するだけで十分簡単ですが、割り当てがある場合はどうでしょうか? 例えば。"STRING sDir = aNewDir".

文法はこちら

OP       : m([-+*/%])      # Mathematical operators
INTEGER  : /[-+]?\d+/      # Signed integers
VARIABLE : /\w[a-z0-9_]*/i # Variable
STRING   : /STRING/i       # String declaration

expression : INTEGER OP expression
          { return main::expression(@item) }
          | VARIABLE OP expression
          { return main::expression(@item) }
          | INTEGER
          | VARIABLE
          { return $main::VARIABLE{$item{VARIABLE}} }

正規表現で十分だと思い始めていますが、「STRING、foo、bar」などのカンマ区切りの宣言用に複雑なものを作成する方法を知りたいです -> $foo; $バー;

4

1 に答える 1

2

私はあなたの質問に完全に従っていません。トークンとして定義STRINGしただけで、セマンティック アクションは与えていません。以下のルール (チュートリアルに表示されます) は、トークンをどうするかを教えてくれます。

print_instruction : /print/i expression
                  { print $item{expression}."\n" }
assign_instruction : VARIABLE "=" expression
                   { $main::VARIABLE{$item{VARIABLE}} = $item{expression} }

instruction : print_instruction
            | assign_instruction

startrule: instruction(s /;/)
  • 一番下のルールは、セミコロンで区切られた 1 つ以上の命令を探していることを示しています。
  • このinstruction規則では、命令は割り当てまたは印刷命令のいずれかであると述べています。
  • print 命令は単語printと anを受け取りexpression、式の結果を出力します。
  • 割り当て命令は、変数、リテラル'='、および式を取り、式の結果を%main::VARIABLEハッシュ内の名前に割り当てます。
  • expressionには 2 つのアクションがあります。1 つは呼び出す複合式用で、もう 1 つはハッシュ&main::expressionから名前付きの値を取得する変数用です。%main::VARIABLE

トークン タイプを作成しましたが、そのトークンに依存するルールはありません。さらに、あなたがやりたいことの要点は理解できますが、あなたがやりたいことのセマンティック アクションを作成するためのガイダンスを提供するには十分ではありません。

命令をどこに配置したいのか正確にはわからないので、次のケースを に追加しましたexpression

         | 'STRING' /[\p{Alpha}_]\w*/
         { return '$' . $item[2] }

'STRING'これは、正確な文字列の後に識別子シーケンスが続くものを探すことを意味します。したがって、次のように使用できます。

print STRING vvv

と取得し$vvvます。


編集

あなたのコメントを正しく理解している場合、string_instructionルールを追加して次のinstructionように定義しました。

string_instruction : 'STRING' /[\p{Alpha}_]\w*/
                   { print "\$$item[2]"; }

そして、私は例に追加しました:

print "STRING v\n";  $parser->startrule( "STRING v" );

を印刷し$vます。

于 2010-08-23T17:20:50.487 に答える