私の質問は、Rascal 構文定義での予約済みキーワードの処理についてです。オンライン ドキュメントから派生した次の Rascal モジュールを使用します。
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";
重要なのは、予約済みキーワードの構築\ MyKeywords
は、レキシカルが として定義されている場合にのみ機能するということ[a-z] !<< [a-z]+ !>> [a-z]
です。字句が少し複雑[a-z0-9] !<< [a-z][a-z0-9]* !>> [a-z0-9]
になると、キーワードは除外されなくなります。
ここで何が間違っていますか?のような識別子の場合、キーワードを除外するにはどうすればよい[a-z][a-z0-9]*
ですか?