0

我尝试通过以下语法使用 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; 

我得到了 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;
    }
4

0 回答 0