【发布时间】:2014-08-12 07:17:49
【问题描述】:
在 lex & yacc 中有一个名为 YY_INPUT 的宏,可以重新定义,例如以这种方式
#define YY_INPUT(buf,result,maxlen) do { \
const int n = gzread(gz_yyin, buf, maxlen); \
if (n < 0) { \
int errNumber = 0; \
reportError( gzerror(gz_yyin, &errNumber)); } \
\
result = n > 0 ? n : YY_NULL; \
} while (0)
我有一些称为 YYACCEPT 宏的语法规则。 如果在 YYACCEPT 之后我调用了 gztell(或 ftell),那么我得到了一个错误的号码,因为解析器已经读取了一些不必要的数据。
那么,如果我有一些称为 YYACCEPT 的规则,我如何获得当前位置(一个不好的解决方案是逐个字符读取)
(我已经做过这样的事情了:
#define YY_USER_ACTION do { \
current_position += yyleng; \
} while (0)
但似乎它不起作用 )
【问题讨论】:
标签: parsing compiler-construction lex lexical-analysis