2016-03-24 8 views
1

私の質問は、ラスカル構文定義で予約されたキーワードを扱うことです。オンラインドキュメントから導出された以下のラスカルモジュールを取る:予約語の処理はレキシカル定義に依存します

module Test 
// Taken from http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html 

start syntax Top = Identifier | ReservedKeyword; 

layout MyLayout = [\t\n\ \r\f]*; 

// Is OK, parse(#Top,"if") succeeds, parse(#Identifier,"if") fails 
lexical Identifier = [a-z] !<< [a-z]+ !>> [a-z] \ MyKeywords; 

// Goes wrong, parse(#Top,"if") fails, parse(#Identifier,"if") succeeds, 
// so "if" is not exluded 
//lexical Identifier = [a-z0-9] !<< [a-z][a-z0-9]* !>> [a-z0-9] \ MyKeywords; 

keyword MyKeywords = "if" | "then" | "else" | "fi"; 

syntax ReservedKeyword = "if" | "then" | "else" | "fi"; 

ポイントは字句が[a-z] !<< [a-z]+ !>> [a-z]として定義されている場合は予約済みキーワードの建設\ MyKeywordsのみ動作することです。字句がやや複雑になる場合は、[a-z0-9] !<< [a-z][a-z0-9]* !>> [a-z0-9]キーワードは除外されなくなりました。

私はここで何が間違っていますか? [a-z][a-z0-9]*などの識別子の場合、キーワードを除外するにはどうすればよいですか?

答えて

0

問題の原因は、[a-z0-9]+の隣な[a-z]などの記号のiuxtapositioningが\オペレータと!>>オペレータ未満強く結合することです。そこでここでは、識別子のみの尾[a-z0-9]+からMyKeywordsを予約している

lexical Identifier = [a-z] !<< [a-z][a-z0-9]+ \ MyKeywords; 

は、この問題を解決するために、あなたは、シーケンス全体からMyKeywordsを削除するためにブラケットを追加することができます。

lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords; 

と再度制限を追加することができます。

lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords !>> [a-z]; 

などと同等か、同等に:

lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) !>> [a-z] \ MyKeywords;