This is getting complex.
This commit is contained in:
parent
d13bf4ea1b
commit
3f81d8ea51
@ -218,6 +218,26 @@ catch:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define C_BLACK "\033[0;30m"
|
||||||
|
#define C_RED "\033[0;31m"
|
||||||
|
#define C_GREEN "\033[0;32m"
|
||||||
|
#define C_YELLOW "\033[0;33m"
|
||||||
|
#define C_BLUE "\033[0;34m"
|
||||||
|
#define C_PURPLE "\033[0;35m"
|
||||||
|
#define C_CYAN "\033[0;36m"
|
||||||
|
#define C_WHITE "\033[0;37m"
|
||||||
|
|
||||||
|
#define CB_BLACK "\033[1;30m"
|
||||||
|
#define CB_RED "\033[1;31m"
|
||||||
|
#define CB_GREEN "\033[1;32m"
|
||||||
|
#define CB_YELLOW "\033[1;33m"
|
||||||
|
#define CB_BLUE "\033[1;34m"
|
||||||
|
#define CB_PURPLE "\033[1;35m"
|
||||||
|
#define CB_CYAN "\033[1;36m"
|
||||||
|
#define CB_WHITE "\033[1;37m"
|
||||||
|
|
||||||
|
#define C_RESET "\033[0m"
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int success = EXIT_SUCCESS;
|
int success = EXIT_SUCCESS;
|
||||||
char *intent = 0;
|
char *intent = 0;
|
||||||
@ -310,35 +330,23 @@ int main(int argc, char **argv) {
|
|||||||
page->entry = char_array();
|
page->entry = char_array();
|
||||||
page->meaning = lex_array();
|
page->meaning = lex_array();
|
||||||
if(!append_file(&page->entry, fn)) goto syntax;
|
if(!append_file(&page->entry, fn)) goto syntax;
|
||||||
struct {
|
int first = 1;
|
||||||
int content;
|
|
||||||
enum lex_symbol expected;
|
|
||||||
} context = { 0, TEXT };
|
|
||||||
for(lex_reset(page->entry.data); ; ) {
|
for(lex_reset(page->entry.data); ; ) {
|
||||||
if(!(lex = lex_array_new(&page->meaning))) goto syntax;
|
if(!(lex = lex_array_new(&page->meaning))) goto syntax;
|
||||||
if(!lex_next(lex)) {
|
if(!lex_next(lex)) {
|
||||||
if(lex->symbol != END) { errno = EILSEQ; goto syntax; }
|
if(lex->symbol != END) { errno = EILSEQ; goto syntax; }
|
||||||
break; /* Terminated successfully. */
|
break; /* Terminated successfully. */
|
||||||
}
|
}
|
||||||
/* Debug print. */
|
|
||||||
if(context.content && context.expected != lex->symbol) {
|
|
||||||
printf("//\n");
|
|
||||||
context.content = 0;
|
|
||||||
} else {
|
|
||||||
context.content = 1;
|
|
||||||
}
|
|
||||||
switch(lex->symbol) {
|
switch(lex->symbol) {
|
||||||
case TEXT: printf("[%.*s]",
|
case TEXT: printf("%s%.*s",
|
||||||
(int)(lex->s1 - lex->s0), lex->s0);
|
first ? "" : " ", (int)(lex->s1 - lex->s0), lex->s0);
|
||||||
context.expected = TEXT; break;
|
first = 0; break;
|
||||||
case PARAGRAPH: printf("\n"); break;
|
case PARAGRAPH: printf("\n" C_RESET); break;
|
||||||
case BIBLE_BOOK: printf("book:[%.*s]",
|
case BIBLE_BOOK: printf(C_YELLOW "%.*s",
|
||||||
(int)(lex->s1 - lex->s0), lex->s0);
|
(int)(lex->s1 - lex->s0), lex->s0); break;
|
||||||
context.expected = BIBLE_CHAPTER_VERSE; break;
|
case BIBLE_CHAPTER_VERSE: printf(" ch. %.*s",
|
||||||
case BIBLE_CHAPTER_VERSE: printf("[ch. %.*s]",
|
(int)(lex->s1 - lex->s0), lex->s0); break;
|
||||||
(int)(lex->s1 - lex->s0), lex->s0);
|
case BIBLE_TEXT: printf("%s%.*s",
|
||||||
context.expected = BIBLE_TEXT; break;
|
|
||||||
case BIBLE_TEXT: printf("[%.*s]",
|
|
||||||
(int)(lex->s1 - lex->s0), lex->s0); break;
|
(int)(lex->s1 - lex->s0), lex->s0); break;
|
||||||
case BIBLE_NEXT: printf("(next)\n"); break;
|
case BIBLE_NEXT: printf("(next)\n"); break;
|
||||||
default:
|
default:
|
||||||
|
@ -9,6 +9,7 @@ int lex_looks_like_day(const char *);
|
|||||||
/* Results. */ \
|
/* Results. */ \
|
||||||
X(END), X(SYNTAX), X(ILLEGAL), X(NOT_FOUND), \
|
X(END), X(SYNTAX), X(ILLEGAL), X(NOT_FOUND), \
|
||||||
\
|
\
|
||||||
|
X(ORDERED_LIST_ITEM), X(LIST_ITEM), X(COMPLETE), X(CANCELLED), X(HEADING), \
|
||||||
/* Text. */ \
|
/* Text. */ \
|
||||||
X(PARAGRAPH), X(TEXT), X(CAPTION), \
|
X(PARAGRAPH), X(TEXT), X(CAPTION), \
|
||||||
\
|
\
|
||||||
|
@ -157,10 +157,18 @@ scan:
|
|||||||
<expect_caption> ws* @s0 glyph (glyph | ws)* @s1 ws* / newline
|
<expect_caption> ws* @s0 glyph (glyph | ws)* @s1 ws* / newline
|
||||||
=> expect_line
|
=> expect_line
|
||||||
{ x->s0 = s0, x->s1 = s1; return x->symbol = CAPTION, 1; }
|
{ x->s0 = s0, x->s1 = s1; return x->symbol = CAPTION, 1; }
|
||||||
|
/* Recognized symbols that go at the beginning of a line. */
|
||||||
<line> newline { x->line = ++scan.line; return x->symbol = PARAGRAPH, 1; }
|
<line> newline { x->line = ++scan.line; return x->symbol = PARAGRAPH, 1; }
|
||||||
|
<line> "[" :=> edict
|
||||||
<line> "--" :=> source
|
<line> "--" :=> source
|
||||||
<line> "->" :=> location
|
<line> "->" :=> location
|
||||||
<line> "[" :=> edict
|
<line> "*" ws => text
|
||||||
|
{ return x->symbol = LIST_ITEM, 1; }
|
||||||
|
<line> @s0 natural @s1 "." ws => text
|
||||||
|
{ x->s0 = s0, x->s1 = s1; return x->symbol = ORDERED_LIST_ITEM, 1; }
|
||||||
|
<line> "!" => text { return x->symbol = COMPLETE, 1; }
|
||||||
|
<line> "^" => text { return x->symbol = CANCELLED, 1; }
|
||||||
|
<line> "#" => text { return x->symbol = HEADING, 1; }
|
||||||
/* Just plain text. */
|
/* Just plain text. */
|
||||||
<line> ws* / glyph :=> text /* match-empty-string: text takes care of it. */
|
<line> ws* / glyph :=> text /* match-empty-string: text takes care of it. */
|
||||||
|
|
||||||
@ -192,7 +200,7 @@ scan:
|
|||||||
/* fixme: This is a hack that doesn't allow apostrophes at the end of a
|
/* fixme: This is a hack that doesn't allow apostrophes at the end of a
|
||||||
word, (not sure there are any in the bible.) Is ' terminated by '';
|
word, (not sure there are any in the bible.) Is ' terminated by '';
|
||||||
otherwise same as glyph+ above. */
|
otherwise same as glyph+ above. */
|
||||||
<bible> @s0 (glyph_minus+ ("'" glyph_minus+)*) | (("'" glyph_minus+)+) @s1
|
<bible> @s0 ("'"? glyph_minus+ ("'" glyph_minus+)*) @s1
|
||||||
{ x->s0 = s0, x->s1 = s1; return x->symbol = BIBLE_TEXT, 1; }
|
{ x->s0 = s0, x->s1 = s1; return x->symbol = BIBLE_TEXT, 1; }
|
||||||
/* Multiple verses can be present, but they end in ''.
|
/* Multiple verses can be present, but they end in ''.
|
||||||
Not strictly enforced. */
|
Not strictly enforced. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user