Irony.Net允许两个变量前缀

时间:2014-05-20 19:47:34

标签: c# parsing irony

我尝试使用Irony.Net语法:

!!test 
!test1 

其中!!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; 

我得到了shift-reduce错误

我做错了什么?

在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;
    }

0 个答案:

没有答案