projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
impl: add {pre,post}_assert statements
[m6w6/ext-psi]
/
src
/
parser.re
diff --git
a/src/parser.re
b/src/parser.re
index ddeaacc2310c1125012272bb16a4b200813102a9..df2d102716025b9df8dcab16634eec88d51a333a 100644
(file)
--- a/
src/parser.re
+++ b/
src/parser.re
@@
-4,10
+4,10
@@
#include "parser.h"
#include "parser.h"
-void *psi_parser_proc_
Alloc(void*(unsigned long)
);
-void psi_parser_proc_
Free(void*, void(*)(void*)
);
-void psi_parser_proc_
(void *, token_t, struct psi_token *, struct psi_parser *
);
-void psi_parser_proc_
Trace(FILE *, const char*
);
+void *psi_parser_proc_
init(void
);
+void psi_parser_proc_
free(void **parser_proc
);
+void psi_parser_proc_
parse(void *parser_proc, token_t r, struct psi_token *token, struct psi_parser *parser
);
+void psi_parser_proc_
trace(FILE *out, char *prefix
);
struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, unsigned flags)
{
struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, unsigned flags)
{
@@
-20,10
+20,10
@@
struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, uns
P->col = 1;
P->line = 1;
P->col = 1;
P->line = 1;
- P->proc = psi_parser_proc_
Alloc(malloc
);
+ P->proc = psi_parser_proc_
init(
);
if (flags & PSI_DEBUG) {
if (flags & PSI_DEBUG) {
- psi_parser_proc_
T
race(stderr, "PSI> ");
+ psi_parser_proc_
t
race(stderr, "PSI> ");
}
return P;
}
return P;
@@
-86,7
+86,7
@@
bool psi_parser_open_string(struct psi_parser *P, const char *string, size_t len
static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
{
static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
{
- PSI_DEBUG_PRINT(P, "PSI
>
Fill: n=%zu (input.type=%d)\n", n, P->input.type);
+ PSI_DEBUG_PRINT(P, "PSI
<
Fill: n=%zu (input.type=%d)\n", n, P->input.type);
/* init if n==0 */
if (!n) {
/* init if n==0 */
if (!n) {
@@
-109,7
+109,7
@@
static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
break;
}
break;
}
- PSI_DEBUG_PRINT(P, "PSI
>
Fill: cur=%p lim=%p eof=%p\n", P->cur, P->lim, P->eof);
+ PSI_DEBUG_PRINT(P, "PSI
<
Fill: cur=%p lim=%p eof=%p\n", P->cur, P->lim, P->eof);
}
switch (P->input.type) {
}
switch (P->input.type) {
@@
-137,14
+137,14
@@
static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
if (didread < available) {
P->eof = P->lim;
}
if (didread < available) {
P->eof = P->lim;
}
- PSI_DEBUG_PRINT(P, "PSI
>
Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
+ PSI_DEBUG_PRINT(P, "PSI
<
Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
consumed, reserved, available, didread);
}
#endif
break;
}
consumed, reserved, available, didread);
}
#endif
break;
}
- PSI_DEBUG_PRINT(P, "PSI
>
Fill: avail=%td\n", P->lim - P->cur);
+ PSI_DEBUG_PRINT(P, "PSI
<
Fill: avail=%td\n", P->lim - P->cur);
return P->lim - P->cur;
}
return P->lim - P->cur;
}
@@
-152,15
+152,15
@@
static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
void psi_parser_parse(struct psi_parser *P, struct psi_token *T)
{
if (T) {
void psi_parser_parse(struct psi_parser *P, struct psi_token *T)
{
if (T) {
- psi_parser_proc_(P->proc, T->type, T, P);
+ psi_parser_proc_
parse
(P->proc, T->type, T, P);
} else {
} else {
- psi_parser_proc_(P->proc, 0, NULL, P);
+ psi_parser_proc_
parse
(P->proc, 0, NULL, P);
}
}
void psi_parser_dtor(struct psi_parser *P)
{
}
}
void psi_parser_dtor(struct psi_parser *P)
{
- psi_parser_proc_
Free(P->proc, free
);
+ psi_parser_proc_
free(&P->proc
);
switch (P->input.type) {
case PSI_PARSE_FILE:
switch (P->input.type) {
case PSI_PARSE_FILE:
@@
-204,7
+204,7
@@
void psi_parser_free(struct psi_parser **P)
#define RETURN(t) do { \
P->num = t; \
#define RETURN(t) do { \
P->num = t; \
- PSI_DEBUG_PRINT(P, "PSI
>
TOKEN: %d %.*s (EOF=%d %s:%u:%u)\n", \
+ PSI_DEBUG_PRINT(P, "PSI
<
TOKEN: %d %.*s (EOF=%d %s:%u:%u)\n", \
P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF, \
P->file.fn, P->line, P->col); \
return t; \
P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF, \
P->file.fn, P->line, P->col); \
return t; \
@@
-255,12
+255,27
@@
token_t psi_parser_scan(struct psi_parser *P)
"}" {RETURN(PSI_T_RBRACE);}
"[" {RETURN(PSI_T_LBRACKET);}
"]" {RETURN(PSI_T_RBRACKET);}
"}" {RETURN(PSI_T_RBRACE);}
"[" {RETURN(PSI_T_LBRACKET);}
"]" {RETURN(PSI_T_RBRACKET);}
+ "!=" {RETURN(PSI_T_CMP_NE);}
+ "==" {RETURN(PSI_T_CMP_EQ);}
+ "&&" {RETURN(PSI_T_AND);}
+ "||" {RETURN(PSI_T_OR);}
"=" {RETURN(PSI_T_EQUALS);}
"*" {RETURN(PSI_T_ASTERISK);}
"=" {RETURN(PSI_T_EQUALS);}
"*" {RETURN(PSI_T_ASTERISK);}
+ "~" {RETURN(PSI_T_TILDE);}
+ "!" {RETURN(PSI_T_NOT);}
+ "%" {RETURN(PSI_T_MODULO);}
"&" {RETURN(PSI_T_AMPERSAND);}
"+" {RETURN(PSI_T_PLUS);}
"-" {RETURN(PSI_T_MINUS);}
"/" {RETURN(PSI_T_SLASH);}
"&" {RETURN(PSI_T_AMPERSAND);}
"+" {RETURN(PSI_T_PLUS);}
"-" {RETURN(PSI_T_MINUS);}
"/" {RETURN(PSI_T_SLASH);}
+ "|" {RETURN(PSI_T_PIPE);}
+ "^" {RETURN(PSI_T_CARET);}
+ "<<" {RETURN(PSI_T_LSHIFT);}
+ ">>" {RETURN(PSI_T_RSHIFT);}
+ "<=" {RETURN(PSI_T_CMP_LE);}
+ ">=" {RETURN(PSI_T_CMP_GE);}
+ "<" {RETURN(PSI_T_LCHEVR);}
+ ">" {RETURN(PSI_T_RCHEVR);}
"..." {RETURN(PSI_T_ELLIPSIS);}
[\r\n] { NEWLINE(nextline); }
[\t ]+ { continue; }
"..." {RETURN(PSI_T_ELLIPSIS);}
[\r\n] { NEWLINE(nextline); }
[\t ]+ { continue; }
@@
-301,6
+316,8
@@
token_t psi_parser_scan(struct psi_parser *P)
'LIB' {RETURN(PSI_T_LIB);}
'LET' {RETURN(PSI_T_LET);}
'SET' {RETURN(PSI_T_SET);}
'LIB' {RETURN(PSI_T_LIB);}
'LET' {RETURN(PSI_T_LET);}
'SET' {RETURN(PSI_T_SET);}
+ 'PRE_ASSERT' {RETURN(PSI_T_PRE_ASSERT);}
+ 'POST_ASSERT' {RETURN(PSI_T_POST_ASSERT);}
'RETURN' {RETURN(PSI_T_RETURN);}
'FREE' {RETURN(PSI_T_FREE);}
'TEMP' {RETURN(PSI_T_TEMP);}
'RETURN' {RETURN(PSI_T_RETURN);}
'FREE' {RETURN(PSI_T_FREE);}
'TEMP' {RETURN(PSI_T_TEMP);}