Files
hustoj/core/sim/sim_3_01/lisplang.l
2024-10-10 12:56:56 +08:00

145 lines
2.4 KiB
Plaintext

%{
/* This file is part of the software similarity tester SIM.
Written by Dick Grune, Vrije Universiteit, Amsterdam.
$Id: lisplang.l,v 2.19 2017-03-19 09:23:19 dick Exp $
*/
/*
LISP language front end for the similarity tester.
Author: Gertjan Akkerman <akkerm@cs.vu.nl>
Date: Thu, 9 Apr 87 11:15:23 MDT
*/
#include "token.h"
#include "language.h"
#include "algollike.h"
#include "lex.h"
#include "lang.h"
/* General language front end data */
Token lex_token;
size_t lex_nl_cnt;
size_t lex_tk_cnt;
size_t lex_non_ascii_cnt;
/* Language-dependent data */
#include "idf.h"
static const struct idf reserved[] = {
{"append", NORM('a')},
{"append1", NORM('b')},
{"atom", NORM('t')},
{"car", NORM('h')},
{"cdr", NORM('t')},
{"cond", NORM('c')},
{"cons", NORM('s')},
{"defun", NORM('u')},
{"do", NORM('d')},
{"eq", NORM('e')},
{"equal", NORM('e')}, /* See eq */
{"for", NORM('f')},
{"if", NORM('i')},
{"list", NORM('l')},
{"nconc", NORM('n')},
{"rplaca", NORM('A')},
{"rplacd", NORM('D')}
};
/* Token sets for module algollike */
const Token Non_Finals[] = {
NORM('('),
NORM('['),
No_Token
};
const Token Non_Initials[] = {
NORM(')'),
NORM(']'),
No_Token
};
const Token Openers[] = {
NORM('('),
NORM('['),
No_Token
};
const Token Closers[] = {
NORM(')'),
NORM(']'),
No_Token
};
/* Language-dependent code */
const char *Subject = "Lisp programs";
void
Init_Language(void) {
Init_Algol_Language(Non_Finals, Non_Initials, Openers, Closers);
}
int
May_Be_Start_Of_Run(Token ch) {
return May_Be_Start_Of_Algol_Run(ch);
}
size_t
Best_Run_Size(const Token *str, size_t size) {
return Best_Algol_Run_Size(str, size);
}
%}
%option noyywrap
%Start Comment
Layout ([ \t\r\f])
ASCII95 ([\040-\176])
AnyQuoted (\\.)
StrChar ([^\"\n\\]|{AnyQuoted})
ChrChar ([^\'\\]|{AnyQuoted})
IdfChar ([-!#$%&*+,/0-9:;<=>?@A-Z\\^_`a-z{}~])
EscIdf (({IdfChar}|\\.)+)
QuotIdf ("|"[^\|\n]*"|")
Idf ({EscIdf}|{QuotIdf})
%%
";".*$ { /* comment */
}
\"{StrChar}*\" { /* strings */
return_ch('"');
}
{Idf} { /* identifier */
return_tk(idf_in_list(yytext, reserved, sizeof reserved, IDF));
}
\n { /* count newlines */
return_eol();
}
{Layout} { /* ignore layout */
}
{ASCII95} { /* copy other text */
return_ch(yytext[0]);
}
. { /* count non-ASCII chars */
lex_non_ascii_cnt++;
}
%%
/* More language-dependent code */
void
yystart(void) {
BEGIN INITIAL;
}