次のように、 Ironyで PHP スタイルの変数を定義しようとしています。
variable.Rule = "$" + identifier;
$
と の間にスペースを入れることが許可されていることを除いて、うまく機能しますidentifier
。それを防ぎたい。どのように?
新しいカスタマイズされた端末を作成する必要がありますか? IdentifierTerminal
もしそうなら、私はまだ魔法を利用することができますか?
調べてみると、実際には「 NameIncludesPrefix IdentifierTerminal
」のフラグがあることがわかりますが、それは 1 か所でしか使用されていません。接頭辞がこのCompoundTokenDetails
オブジェクトに保存されているように見えます...使用方法がわかりません。編集:気にしないでください、これは行き止まりでした。これらのフラグは、変数の動作に修飾子を追加するためのものです。
これはちょっと効く...
class VariableTerminal : Terminal
{
public VariableTerminal(string name) : base(name)
{
}
public override IList<string> GetFirsts()
{
return new[] { "$" };
}
public override Token TryMatch(ParsingContext context, ISourceStream source)
{
if (source.PreviewChar != '$') return null;
do
{
source.PreviewPosition++;
} while (!source.EOF() && char.IsLetter(source.PreviewChar));
var token = source.CreateToken(OutputTerminal);
return token;
}
}
私はそれが何でOuputTerminal
あるかはよくわかりません..現在のプレビュー位置に基づいたある種の動的プロパティだと思いますか? Irony での解析方法は少し奇妙だと思います...
とにかく、これの問題は、次のコードのように構文エラーがある場合に、VariableTerminal
以前に で行っていた方法ではなく、this を使用した場合です。"$" + IdentifierTerminal"
p cat
と言っていた識別子端末
予想される構文エラー: { real string $ true false ...
しかし、変数は代わりにこのエラーを返します:
無効な文字: 'c'
前のエラーの方が便利だったと思います。なぜ別のエラーが吐き出されているのかよくわかりません...代わりにそれを言うにはどうすればよいですか?