如何解决野牛我需要访问 expr
我可以很好地使用它,但是在 expr 中我想验证我创建的 expr tADD
等,但是我无法访问 expr
内部操作,我如何访问它?它只返回 0
%{
#include <stdio.h>
void yyerror (const char *s)
#define YYSTYPE char *
extern YYSTYPE yylval;
extern int line;
{}
%}
%token tADD tSUB tMUL tDIV tSTRING tNUM tPRINT tGET tSET tFUNCTION tRETURN tIDENT tEQUALITY tIF tGT tLT tGEQ tLEQ tINC tDEC
%start prog
%%
prog: '[' stmtlst ']'
;
stmtlst: stmtlst stmt |
;
stmt: setStmt | if | print | unaryOperation | expr | returnStmt
;
getExpr: '[' tGET ',' tIDENT ',' '[' exprList ']' ']'
| '[' tGET ',' '[' ']' ']'
| '[' tGET ',' tIDENT ']'
;
setStmt: '[' tSET ',' expr ']'
;
if: '[' tIF ',' condition ',' '[' stmtlst ']' ']'
| '[' tIF ',' '[' stmtlst ']' '[' stmtlst ']' ']'
;
print: '[' tPRINT ',' '[' expr ']' ']'
;
operation: '[' tADD ',' expr ',' expr ']' {
if($2){
printf("op\n");
}
printf("%d here ",$4);
}
| '[' tSUB ',' expr ']'
| '[' tMUL ',' expr ']'
| '[' tDIV ',' expr ']'
;
unaryOperation: '[' tINC ',' tIDENT ']'
| '[' tDEC ',' tIDENT ']'
;
expr: tNUM | tSTRING | function | operation | condition
;
function: '[' tFUNCTION ',' '[' parametersList ']' ',' '[' stmtlst ']' ']'
| '[' tFUNCTION ',' '[' ']' ',' '[' stmtlst ']' ']'
;
condition: '[' tEQUALITY ',' expr ']'
| '[' tGT ',' expr ']'
| '[' tLT ',' expr ']'
| '[' tGEQ ',' expr ']'
| '[' tLEQ ',' expr ']'
;
returnStmt: '[' tRETURN ',' expr ']'
| '[' tRETURN ']'
;
parametersList: parametersList ',' tIDENT | tIDENT
;
exprList: exprList ',' expr | expr{
printf("%s\n",$1);
}
;
%%
int main ()
{
if (yyparse()) {
// parse error
printf("ERROR\n");
return 1;
}
else {
// successful parsing
printf("OK\n");
return 0;
}
}
我使用 $4
但我总是得到 0
作为所有操作的值,
expr: tNUM | tSTRING | function | operation | condition
;
还有我使用的 flex
%{
#include "username-hw3.tab.h"
%}
%%
['][^']*['] return tSTRING;
["]Get["] return tGET;
["]Set["] return tSET;
["]Function["] return tFUNCTION;
["]Print["] return tPRINT;
["]If["] return tIF;
["]Return["] return tRETURN;
["]"+"["] return tADD;
["]"-"["] return tSUB;
["]"*"["] return tMUL;
["]"/"["] return tDIV;
["]"++"["] return tINC;
["]">"["] return tGT;
["]"=="["] return tEQUALITY;
["]"--"["] return tDEC;
["]"<"["] return tLT;
["]"<="["] return tLEQ;
["]">="["] return tGEQ;
["][_a-zA-Z][a-zA-Z0-9_]*["] return tIDENT;
[0-9]+ |
-[0-9]+ |
[0-9]+"."[0-9]+ |
-[0-9]+"."[0-9]+ return tNUM;
[ \t\n]+
. return yytext[0];
%%
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。