私の質問は、ラスカル構文定義で予約されたキーワードを扱うことです。オンラインドキュメントから導出された以下のラスカルモジュールを取る:予約語の処理はレキシカル定義に依存します
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]*
などの識別子の場合、キーワードを除外するにはどうすればよいですか?