parsing - 耶尔瓦尔和联盟

标签 parsing yacc bison lexical-analysis

yacc 文件中 union 的用途是什么?它与flex文件中的yylval直接相关吗?如果不使用yylval,那么就不需要使用union?

最佳答案

union的目的是允许将不同类型的对象存储到由flex发出的节点中。

为了更好地解释,您可以举个例子:

%union
{
    int intValue;
    float floatValue;
    char *stringValue;
}

.y 中,如果您想为 intfloatstring 类型提供基本支持。你能用这个做什么?

有两件事:

首先,您可以在生成 token 时自动设置正确的值。想想前面例子的 .l 文件,你可以有:

[a-zA-Z][a-zA-Z0-9]* {
 yylval.stringValue = strdup(yytext);
 return IDENTIFIER;
}

[0-9]+ { 
 yylval.intValue = atoi(yytext);
 return INTEGER;
}

[0-9]*\.[0-9]+"f"? {
    yylval.floatValue = new atof(yytext);
 return FLOAT;
}

此外,您还可以在 flex 语法中直接使用值:

nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }

最后,如果您打算使用 OOP 语法树,您可以将 union 定义为

%union
{
    class ASTNode *node;
}

其中ASTNode是任何类型语法节点的祖先类。

关于parsing - 耶尔瓦尔和联盟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853204/

相关文章:

ruby - 使用 FasterCSV 解析这一行的正确方法?

java - java中解析字符串提取指定​​内容

parsing - Haskell Parsec Parser for Encountering [...]

javascript - JavaScript 的 Yacc/Jay 语法文件?

c++ - Flex & Bison C++

c - 为什么 Bison 只打印输入?

java - 无法解析的日期异常 : SimpleDateFormat

c - 算术表达式也无法在 yacc 语法中正确解析

python - 如何使用 pyparsing 构建完整的 C 解析器?

c - lex 和 yacc — 组合两个词法分析器和一个 yacc