1

私の質問は、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]*ですか?

4

1 に答える 1

0

[a-z]この問題の原因は、 next toなどのシンボルの iuxtapositioning が、演算子および演算子[a-z0-9]+よりも強力ではないことです。\!>>

したがって、ここでは識別子MyKeywordsの末尾からのみ予約しています。[a-z0-9]+

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;
于 2016-03-24T11:37:55.913 に答える