是否有可能使YACC(或者我是我的MPPG)输出抽象语法树(AST).
我正在阅读的所有内容都表明YACC很容易做到这一点,但是我很难知道你是如何知道何时在树中建立节点的时候.
我在理解移位/缩小语法的问题时遇到了问题,我知道语法没有歧义.这个案例是if else类型之一,但它不是'悬空的'问题,因为我有强制的END子句来分隔代码块.
这是gppg的语法(它是一个像编译器编译器一样的Bison ......而且它不是一个echo):
%output=program.cs
%start program
%token FOR
%token END
%token THINGS
%token WHILE
%token SET
%token IF
%token ELSEIF
%token ELSE
%%
program : statements
;
statements : /*empty */
| statements stmt
;
stmt : flow
| THINGS
;
flow : '#' IF '(' ')' statements else
;
else : '#' END
| '#' ELSE statements '#' END
| elseifs
;
elseifs : elseifs '#' ELSEIF statements else
| '#' ELSEIF statements else
;
Run Code Online (Sandbox Code Playgroud)
这是冲突输出:
// Parser …Run Code Online (Sandbox Code Playgroud) 在查看好的C#解析器生成器的帖子之后,我偶然发现了GPLEX和GPPG.我想使用GPLEX为GPPG生成令牌以解析和创建树(类似于lex/yacc关系).但是,我似乎无法找到这两者如何相互作用的例子.使用lex/yacc,lex返回由yacc定义的标记,并且可以在yylval中存储值.如何在GPLEX/GPPG中完成此操作(文档中缺少这些内容)?
附件是我想要转换为GPLEX的lex代码:
%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
[Oo][Rr] return OR;
[Aa][Nn][Dd] return AND;
[Nn][Oo][Tt] return NOT;
[A-Za-z][A-Za-z0-9_]* yylval=yytext; return ID;
%%
Run Code Online (Sandbox Code Playgroud)
谢谢!安德鲁