2016-12-13 5 views
5

私はperl 5を知らないが、私はperl 6で遊ぶと思った。私は文法能力を試しているが、これまでは運がない。ここに私のコードはここまでです:なぜこのperl 6文法は機能しないのですか?

at TOP 
at word 
(Any) 

をいくつかの理由、それは<num>ルールに一致するには表示されません。

grammar CopybookGrammar { 
     token TOP { {say "at TOP" } <aword><num>} 
     token aword { {say "at word" } [a..z]+ } 
     token num { {say "at NUM" } [0..9]+ } 
} 


sub scanit($contents) { 
     my $match1 = CopybookGrammar.parse($contents); 
     say $match1; 
} 

scanit "outline1"; 

出力は次のようです。何か案は?

答えて

8

あなたはcharacter classes構文で角括弧を忘れてしまった:自分で<[0..9]>+

、単にPerl 6つの正規表現にnon-capturing groupとして機能[ ]角括弧でなければなりません

[a..z]+<[a..z]>+

[0..9]+でなければなりません。したがって、[a..z]+は、文字 "a"に続いて任意の2文字、続いて文字 "z"、その後何度でも何回も一致します。これは「アウトライン」という単語と一致しないため、<aword>トークンが一致しませんでした。また、構文解析は<num>トークンに継続しませんでした。


はPS:文法をデバッグするとき、どこにでも{say ...}ブロックを追加するより便利な代替手段は、Grammar::Debuggerを使用することです。そのモジュールをインストールしたら、コードにuse Grammar::Debugger;という行を一時的に追加してプログラムを実行することができます。その後、文法を段階的に進めて(ENTERキーを押して続行します)、どのトークン/ルールが一致するかを教えます道。

+2

Grammar :: Debuggerの姉妹モジュールは、Grammar :: Debuggerと同じ場所にある** Grammar :: Tracer **です。 'Grammar :: Tracer;を使うと、入力データに対して実行中の文法の痕跡が得られます。 – donaldh

関連する問題