2011-01-06 14 views
0

我知道,措辞不佳的问题不知道还有什么要问。 我似乎总是在错误分支,无论我进入,并不能找出我搞砸了。我使用莱克斯的特殊风味/ YACC称为GPPG这只是设置这一切了与C#Lex Yacc,我应该标记字符文字吗?

这里使用的是我的Ÿ

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

的想法是我应该能够通过 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

您需要一个lex规则以原样返回标点符号,以便yacc语法可以识别它们。例如:

[()]  { return *yytext; } 

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

+0

非常感谢!我知道它必须是一件非常简单的事情。对于GPPG,它是这样做的: '[()] \t \t \t {return(int)yytext [0]; }'支持特定的字符。 – Beta033 2011-01-06 16:34:53