summaryrefslogtreecommitdiff
path: root/test/ragel.d/awkemu.rl
diff options
context:
space:
mode:
Diffstat (limited to 'test/ragel.d/awkemu.rl')
-rw-r--r--test/ragel.d/awkemu.rl154
1 files changed, 0 insertions, 154 deletions
diff --git a/test/ragel.d/awkemu.rl b/test/ragel.d/awkemu.rl
deleted file mode 100644
index 201559d6..00000000
--- a/test/ragel.d/awkemu.rl
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * @LANG: c
- */
-
-/*
- * Emulate the basic parser of the awk program. Breaks lines up into
- * words and prints the words.
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#define LINEBUF 2048
-static char lineBuf[LINEBUF];
-static char blineBuf[LINEBUF];
-static int lineLen;
-static int blineLen;
-static int words;
-
-void finishLine();
-
-struct awkemu
-{
- int cs;
-};
-
-%%{
- machine awkemu;
-
- variable cs fsm->cs;
-
- # Starts a line. Will initialize all the data necessary for capturing the line.
- action startline {
- lineLen = 0;
- blineLen = 0;
- words = 0;
- }
-
- # Will be executed on every character seen in a word. Captures the word
- # to the broken up line buffer.
- action wordchar {
- blineBuf[blineLen++] = fc;
- }
-
- # Terminate a word. Adds the null after the word and increments the word count
- # for the line.
- action termword {
- blineBuf[blineLen++] = 0;
- words += 1;
- }
-
- # Will be executed on every character seen in a line (not including
- # the newline itself.
- action linechar {
- lineBuf[lineLen++] = fc;
- }
-
- # This section of the machine deals with breaking up lines into fields.
- # Lines are separed by the whitespace and put in an array of words.
-
- # Words in a line.
- word = (extend - [ \t\n])+;
-
- # The whitespace separating words in a line.
- whitespace = [ \t];
-
- # The components in a line to break up. Either a word or a single char of
- # whitespace. On the word capture characters.
- blineElements = word $wordchar %termword | whitespace;
-
- # Star the break line elements. Just be careful to decrement the leaving
- # priority as we don't want multiple character identifiers to be treated as
- # multiple single char identifiers.
- breakLine = ( blineElements $1 %0 )* . '\n';
-
- # This machine lets us capture entire lines. We do it separate from the words
- # in a line.
- bufLine = (extend - '\n')* $linechar %{ finishLine(); } . '\n';
-
- # A line can then consist of the machine that will break up the line into
- # words and a machine that will buffer the entire line.
- line = ( breakLine | bufLine ) > startline;
-
- # Any number of lines.
- main := line*;
-}%%
-
-void finishLine()
-{
- int i;
- char *pword = blineBuf;
- lineBuf[lineLen] = 0;
- printf("endline(%i): %s\n", words, lineBuf );
- for ( i = 0; i < words; i++ ) {
- printf(" word: %s\n", pword );
- pword += strlen(pword) + 1;
- }
-}
-
-%% write data;
-
-void awkemu_init( struct awkemu *fsm )
-{
- %% write init;
-}
-
-void awkemu_execute( struct awkemu *fsm, const char *_data, int _len )
-{
- const char *p = _data;
- const char *pe = _data+_len;
- %% write exec;
-}
-
-int awkemu_finish( struct awkemu *fsm )
-{
- if ( fsm->cs == awkemu_error )
- return -1;
- if ( fsm->cs >= awkemu_first_final )
- return 1;
- return 0;
-}
-
-#include <stdio.h>
-#define BUFSIZE 2048
-
-struct awkemu fsm;
-char buf[BUFSIZE];
-
-void test( char *buf )
-{
- int len = strlen( buf );
- awkemu_init( &fsm );
- awkemu_execute( &fsm, buf, len );
- if ( awkemu_finish( &fsm ) > 0 )
- printf("ACCEPT\n");
- else
- printf("FAIL\n");
-}
-
-int main()
-{
- test( "" );
- test( "one line with no newline" );
- test( "one line\n" );
- return 0;
-}
-
-##### OUTPUT #####
-ACCEPT
-FAIL
-endline(2): one line
- word: one
- word: line
-ACCEPT