我一直在尝试编写一种语言翻译器,使用flex和yacc与C.通常我以某种方式完成它,但我发现自己不理解一些重要的事情以完成它。yacc语法规则的语义
所有我似乎无法理解下面的语法规则是如何工作的
声明列表→申报表声明
本地报关→本地报关申报的第一
我在这里看到一个例子How do i implement If statement in Flex/bison在“陈述语句”,引用:
struct AstElement* makeStatement(struct AstElement* result, struct AstElement* toAppend)
{
if(!result)
{
result = checkAlloc(sizeof(*result));
result->kind = ekStatements;
result->data.statements.count = 0;
result->data.statements.statements = 0;
}
assert(ekStatements == result->kind);
result->data.statements.count++;
result->data.statements.statements = realloc(result->data.statements.statements, result->data.statements.count*sizeof(*result->data.statements.statements));
result->data.statements.statements[result->data.statements.count-1] = toAppend;
return result;
}
但我不知道它是否与其他规则一样,另外,我想了解我在做什么,而不仅仅是复制。
我的第二个问题是在下面的语法规则
声明→型规格标识; | type-spec id [num];
类型说明符→INT
我在这里获得了整点,它是什么,它应该做什么等等,但我无法将认识转化为代码和C
您应该编写代码,以便在您的程序符合规则时执行任何操作。 – immibis
嗯,我知道这很多。我觉得我需要的代码是特定的,但是。 – codeNewbie
当程序符合规则时,您希望程序执行什么操作? – immibis