我有這個 .lex 檔案:
%option noyywrap
%{
#include <string.h>
#include "ncc.h"
#include "tok/tokens.h"
static void addToken(Token t);
#define TK_NL ((Token){ \
.type = NL \
})
%}
LETTER [a-zA-Z]
DIGIT [0-9]
NONDIGIT {LETTER}|"_"
/* Digits */
OCTAL_DIGIT [0-7]
HEX_DIGIT [0-9a-fA-F]
HEX_QUAD {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT}
/* Escape sequences */
SIMPLE_ESC "\\'"|"\\\""|"\\?"|"\\\\"|"\\a"|"\\b"|"\\f"|"\\n"|"\\r"|"\\t"|"\\v"
OCTAL_ESC "\\" {OCTAL_DIGIT} ({OCTAL_DIGIT}?) ({OCTAL_DIGIT}?)
HEX_ESC "\\" {HEX_DIGIT}
UCHRNAME ("\\u" {HEX_QUAD}) | ("\\U" {HEX_QUAD} {HEX_QUAD})
ESCAPE_SEQ {SIMPLE_ESC}|{OCTAL_ESC}|{HEX_ESC}|{UCHRNAME}
C_CHAR [^'\\]|{ESCAPE_SEQ}
C_CHAR_SEQ {C_CHAR}
/* Literals */
CHAR_LITERAL "'" {C_CHAR_SEQ} "'"
%%
"\n" { addToken(TK_NL); }
{CHAR_LITERAL} {
char c;
if (yytext[1] == '\\')
{
// Escape sequence
switch (yytext[2])
{
case 'n':
c = '\n';
break;
case 't':
c = '\t';
break;
case 'r':
c = '\r';
break;
case 'v':
c = '\v';
break;
case 'a':
c = '\a';
break;
case 'f':
c = '\f';
break;
case 'b':
c = '\b';
break;
case '\'':
c = '\'';
break;
case '"':
c = '"';
break;
case '?':
c = '?';
break;
case '\\':
c = '\\';
break;
default:
break;
}
}
addToken((Token){
.type = CHAR_CNST,
.char_literal = c
}); }
. {/* eat up other characters */}
%%
static Token *tokens;
static size_t tokens_len = 0;
Token *LexStream(FILE *s, size_t *len_out)
{
tokens = NULL;
yyin = s;
yylex();
*len_out = tokens_len;
return tokens;
}
char *GetTokenAsString(Token token)
{
char *result = NULL;
switch (token.type)
{
case NL:
result = strdup("NL");
break;
case CHAR_CNST:
result = strdup("CHAR_CNST");
break;
}
if (result == NULL)
{
Crash(CR_NOMEM);
}
return result;
}
static void addToken(Token t)
{
tokens_len;
if (tokens == NULL)
{
tokens = malloc(sizeof(*tokens));
}
else
{
tokens = realloc(tokens, sizeof(*tokens) * tokens_len);
}
if (tokens == NULL)
{
Crash(CR_NOMEM);
}
tokens[tokens_len - 1] = t;
}
最重要的是最重要的,但為了背景關系,我也包括了其余部分。
當我嘗試編譯它時,出現以下錯誤:
../ncc/tok/tokens.lex:41: unrecognized rule
我試過谷歌搜索,隨機改變東西,自己更換零件,但都沒有成功。在這一點上,我不知道可能是什么問題。
謝謝閱讀!
uj5u.com熱心網友回復:
Lex 模式不能包含未加引號的空格。因此,所有擴展包含不帶引號的空格的宏都會在使用它們的模式中產生語法錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364680.html
標籤:C flex-lexer 莱克斯
上一篇:memset對浮點陣列做了什么?
下一篇:從套接字讀取時的意外行為
