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

发布于 2024-10-10 10:00:30 字数 1248 浏览 6 评论 0原文

我知道,这个问题措辞不好,但不知道还能怎么问。 无论我输入什么,我似乎总是会进入错误分支,并且无法弄清楚我在哪里搞砸了。我正在使用 Lex/YACC 的一种特殊风格,称为 GPPG,它只是将这一切设置为与 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;}

I know, poorly worded question not sure how else to ask though.
I always seem to end up in the error branch regardless of what i'm entering and can't figure out where i'm screwing this up. i'm using a particular flavor of Lex/YACC called GPPG which just sets this all up for use with C#

Here is my 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*/ }          
            ;

here's my Lex

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

The idea is that i should be able to pass
Method('value') to it and have it properly recognize that this is correct syntax

ultimately the plan is to execute the Method passing the various parameters as values

i've also tried several derivations. for example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冬天的雪花 2024-10-17 10:00:30

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

[()]        { return *yytext; }

添加到你的第二个例子中应该可以解决问题。

You need a lex rule to return the punctuation tokens 'as-is' so that the yacc grammar can recognize them. Something like:

[()]        { return *yytext; }

added to your second example should do the trick.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文