私は Marpa で新しい DSL を実装しており、(Regexp::Grammars から) 満足しています。私の言語は、一連の単項演算子と 2 項演算子、C スタイルの識別子を持つオブジェクト、おなじみのドット表記を使用したメソッド呼び出しをサポートしています。例えば:
foo.has(bar == 42 AND baz == 23)
Marpa の文法記述言語が提供する優先ルール機能を見つけて、それを大いに利用するようになったので、G1 ルールはほぼ 1 つしかありませんExpression
。抜粋 (多くの代替案、および簡潔にするために省略されたセマンティック アクション):
Expression ::=
NumLiteral
| '(' Expression ')' assoc => group
|| Expression ('.') Identifier
|| Expression ('.') Identifier Args
| Expression ('==') Expression
|| Expression ('AND') Expression
Args ::= ('(') ArgsList (')')
ArgsList ::= Expression+ separator => [,]
Identifier ~ IdentifierHeadChar IdentifierBody
IdentifierBody ~ IdentifierBodyChar*
IdentifierHeadChar ~ [a-zA-Z_]
IdentifierBodyChar ~ [a-zA-Z0-9_]
NumLiteral ~ [0-9]+
ご覧のとおり、スキャンレス インターフェイス (SLIF) を使用しています。私の問題は、これも解析することです。たとえば、次のようになります。
foo.AND(5)
Marpa は、ドットの後には識別子しか存在できないことを認識しているため、それがAND
キーワードである可能性さえ考慮していません。キーワードとして明示的に識別する別の字句解析段階を実行することで、この問題を回避できることはわかっていますAND
が、その小さなペーパーカットは努力する価値がありません。
SLIF でIdentifier
ルールを非キーワード識別子のみに制限する方法はありますか?