次の構文で Irony.Net を使用しようとしています。
!!test
!test1
where !!test
- グローバル変数および!test1
- ローカル変数
私はこのコードを書きました:
var local_identifier = new IdentifierTerminal("localidentifier","","!");
var global_identifier = new IdentifierTerminal("globalidentifier","","!!");
var param_identifier = new NonTerminal("paramidentifier");
param_identifier.Rule = local_identifier | global_identifier;
そして、シフト削減エラーが発生します
私が間違っていることは何ですか?
codeplex ( https://irony.codeplex.com/discussions/546013 ) の助けを借りて、問題を解決します。結果コードは次のとおりです。
public static IdentifierTerminal CreateLocalIdentifier(string name)
{
var id = new IdentifierTerminal(name, IdOptions.None);
id.AddPrefix("!", IdOptions.IsNotKeyword);
id.StartCharCategories.AddRange(new[]
{
UnicodeCategory.UppercaseLetter, //Ul
UnicodeCategory.LowercaseLetter, //Ll
UnicodeCategory.TitlecaseLetter, //Lt
UnicodeCategory.ModifierLetter, //Lm
UnicodeCategory.OtherLetter, //Lo
UnicodeCategory.LetterNumber //Nl
});
id.CharCategories.AddRange(new[]
{
UnicodeCategory.DecimalDigitNumber, //Nd
UnicodeCategory.ConnectorPunctuation, //Pc
UnicodeCategory.SpacingCombiningMark, //Mc
UnicodeCategory.NonSpacingMark, //Mn
UnicodeCategory.Format //Cf
});
id.CharsToRemoveCategories.Add(UnicodeCategory.Format);
return id;
}
public static IdentifierTerminal CreateGlobalIdentifier(string name)
{
var id = new IdentifierTerminal(name, IdOptions.None);
id.AddPrefix("!!", IdOptions.IsNotKeyword);
id.StartCharCategories.AddRange(new[]
{
UnicodeCategory.UppercaseLetter, //Ul
UnicodeCategory.LowercaseLetter, //Ll
UnicodeCategory.TitlecaseLetter, //Lt
UnicodeCategory.ModifierLetter, //Lm
UnicodeCategory.OtherLetter, //Lo
UnicodeCategory.LetterNumber //Nl
});
id.CharCategories.AddRange(new[]
{
UnicodeCategory.DecimalDigitNumber, //Nd
UnicodeCategory.ConnectorPunctuation, //Pc
UnicodeCategory.SpacingCombiningMark, //Mc
UnicodeCategory.NonSpacingMark, //Mn
UnicodeCategory.Format //Cf
});
id.CharsToRemoveCategories.Add(UnicodeCategory.Format);
return id;
}