Lex Yacc,我应该将字符文字标记出来吗?

时间:2011-01-06 01:24:52

标签: yacc lex

我知道,措辞不好的问题不知道怎么回事。 我似乎总是在错误分支中结束,无论我进入什么,无法弄清楚我在哪里搞砸了。我正在使用一种名为GPPG的特殊口味的Lex / YACC,它只是将这一切设置为与C#一起使用

这是我的Y

method      :  L_METHOD L_VALUE ')' { System.Diagnostics.Debug.WriteLine("Found a method: Name:" + $1.Data ); }
            | error { System.Diagnostics.Debug.WriteLine("Not valid in this statement context ");/*Throw new exception*/ }          
            ;

这是我的Lex

\'[^']*\'           {this.yylval.Data = yytext.Replace("'",""); return (int)Tokens.L_VALUE;}
[a-zA-Z0-9]+\(      {this.yylval.Data = yytext; return (int)Tokens.L_METHOD;}

我的想法是我应该能够通过 Method('value')并正确认识到这是正确的语法

最终计划是执行Method将各种参数作为值

传递

我也尝试了几种推导。例如:

 method     :  L_METHOD '(' L_VALUE ')' { System.Diagnostics.Debug.WriteLine("Found a method: Name:" + $1.Data ); }
                | error { System.Diagnostics.Debug.WriteLine("Not valid in this statement context: ");/*Throw new exception*/ }         
                ;

   \'[^']*\'            {this.yylval.Data = yytext.Replace("'",""); return (int)Tokens.L_VALUE;}
    [a-zA-Z0-9]+        {this.yylval.Data = yytext; return (int)Tokens.L_METHOD;}

1 个答案:

答案 0 :(得分:1)

你需要一个lex规则来按原样返回标点符号,以便yacc语法可以识别它们。类似的东西:

[()]        { return *yytext; }

添加到你的第二个例子应该做的伎俩。