Bison 野牛:偷看下一个字母或记号

Bison 野牛:偷看下一个字母或记号,bison,flex-lexer,Bison,Flex Lexer,在处理字符串时(它有自己的状态,如注释),我需要确定下一个字母是否为“如果是,我不结束字符串状态。所以发生的事情是,我不在字符串状态下结束字符串(我使用,并逐字母处理)。因此,我标记最后一个字符串是否为”如果当前值不是,我退出状态并取消最后一个字母 这有一种奇怪的效果。当我在带有字符串的行中出现错误时,我会看到两次字母(通常是“,”或“)”。如果它恰好在这条线的末端,副作用将计为两条线!(即使没有错误) 我怎样才能解决这个问题?当我离开字符串状态并让YY_用户自行修复时,是否是创建全局变量并标记

在处理字符串时(它有自己的状态,如注释),我需要确定下一个字母是否为“如果是,我不结束字符串状态。所以发生的事情是,我不在字符串状态下结束字符串(我使用
,并逐字母处理)。因此,我标记最后一个字符串是否为”如果当前值不是,我退出状态并取消最后一个字母

这有一种奇怪的效果。当我在带有字符串的行中出现错误时,我会看到两次字母(通常是“,”或“)”。如果它恰好在这条线的末端,副作用将计为两条线!(即使没有错误)

我怎样才能解决这个问题?当我离开字符串状态并让YY_用户自行修复时,是否是创建全局变量并标记它的唯一选项?我有点想避免这样。为了更清楚,我可以只看下一个字母或代币,这可能吗?

在flex中,您可以通过使用
/
lookahead操作符“向前看”未来的代币。这样的规则

ab/cd

将匹配“ab”输入,当且仅当其后跟“cd”。这意味着flex实际上与此规则的“cd”匹配,但在调用规则的操作之前将其推回输入缓冲区,因此当您看到它时,yytext仅包含“ab”,下一个标记将再次读取“cd”

您好,我删除了flex标记,因为它与Adobe编程语言相关,相反,我添加了更合适的gnu flex标记。@Andrea Spadaccini:很高兴知道,今天是我第一次看到gnu flex标记,对我来说也是第一次:)我注意到了错误,因为我在bison标记附近看到了adobe图标。。有点可疑;)请把语法中困扰你的部分贴出来。没有这些,你很难找到解决问题的办法。