Parsing 从lex解析器确定十六进制值

Parsing 从lex解析器确定十六进制值,parsing,flex-lexer,lex,Parsing,Flex Lexer,Lex,我目前正试图解析一个文本文件,并在其中找到任何十六进制数。如果十六进制数字不正确,我会将其显示为not number input: -0xA98F 0XA98H 0x123 0xabc expected output: -0xA98F valid 0x123 valid 0xabc not valid 0xA98H not valid 我的问题是,如果我得到类似0xA98H的东西,它将输出为0xA98并显示为一个数字。我的目标是获得我的输出,就像我的示例一样,但是我看不

我目前正试图解析一个文本文件,并在其中找到任何十六进制数。如果十六进制数字不正确,我会将其显示为not number

input:   

-0xA98F 
0XA98H
0x123 
0xabc

expected output:
-0xA98F valid
 0x123  valid
 0xabc  not valid
 0xA98H not valid
我的问题是,如果我得到类似0xA98H的东西,它将输出为0xA98并显示为一个数字。我的目标是获得我的输出,就像我的示例一样,但是我看不到我的问题有任何解决方案

  [-]?[0][x|X][0-9A-F]+ {cout << yytext << " Number" << endl; }

[-]?[0][x | x][0-9A-F]+{cout以下示例代码根据OP的要求接受十六进制数:

%{
#include <iostream>
#include <string>
using namespace std;

static bool error = false;
static string buffer;
%}

HEX "-"?"0"[xX][0-9A-F]+
EOL (\n|\r|\r\n)

%%

{HEX} { buffer += yytext; }
" " { /* ignore spaces */ }
. { buffer += yytext; error = true; }
{EOL}+ {
  cout << buffer << '\t' << (error ? "not valid" : "valid") << endl;
  buffer.clear();
  error = false;
}

%%

int main(int argc, char **argv) { return yylex(); }

int yywrap() { return 1; }
空格和空行将被忽略


(\n |\r |\r\n)
表示一种模式,用于匹配类似Unix的行尾、类似MacOS的行尾和类似DOS/Windows的行尾(按此顺序)。

以下示例代码根据OP的要求接受十六进制数:

%{
#include <iostream>
#include <string>
using namespace std;

static bool error = false;
static string buffer;
%}

HEX "-"?"0"[xX][0-9A-F]+
EOL (\n|\r|\r\n)

%%

{HEX} { buffer += yytext; }
" " { /* ignore spaces */ }
. { buffer += yytext; error = true; }
{EOL}+ {
  cout << buffer << '\t' << (error ? "not valid" : "valid") << endl;
  buffer.clear();
  error = false;
}

%%

int main(int argc, char **argv) { return yylex(); }

int yywrap() { return 1; }
空格和空行将被忽略


(\n |\r |\r\n)
表示匹配类似Unix的行结束、类似MacOS的行结束和类似DOS/Windows的行结束的模式(按此顺序).

简而言之,我希望忽略此值,而不是显示0xA98,而是显示为0xA98H=不是数字。您为什么创建新问题而不是编辑原始问题。在您改进问题时,我会改进对上一个问题的回答。修改第一个数字匹配的模式很容易没有。但是,只要我不知道1,这项工作就毫无价值。输入中还可能发生什么2。还有什么需要匹配(或不匹配)。请提供一个(不要太长)示例输入和预期输出。输入中唯一会出现的是各种假/正十六进制值。我为输入示例编辑了我的帖子。简而言之,我不想显示0xA98,而是希望忽略该值,并显示为0xA98H=不是数字。你为什么创建新问题而不是编辑原始问题。当你改进问题时,我会改进我对你上一个问题的回答。修改第一个数字匹配第二个无的模式很容易。但是,只要我不知道1,这项工作就毫无价值。输入中可能还会发生什么2。还必须匹配(或不匹配)什么。请提供一个(不要太长)示例输入和预期的输出。输入中唯一会出现的是各种假/正十六进制值。我编辑了输入示例的帖子。我还好奇这段代码是否会忽略其他数字,如小数和整数。@sippycup它会/应该是由于
“0”[xX]
模式中的一部分。以下规则适用于flex生成的扫描仪:模式必须完全匹配才能匹配文本。如果多个模式匹配,则最长匹配获胜。如果多个模式匹配长度相等的文本,则第一个规则获胜。(剩下的你可以在
man flex
info flex
或中找到。我还好奇这段代码是否会忽略其他数字,如小数和整数。@sippycup它会/应该是因为
“0”[xX]
模式中的一部分。以下规则适用于flex生成的扫描仪:模式必须完全匹配才能匹配文本。如果多个模式匹配,则最长的匹配获胜。如果多个模式匹配长度相等的文本,则第一条规则获胜。(其余规则可在
man flex
info flex
或中找到)。