Merge pull request #4 from jeremyroman/master
[mspang/inapt.git] / parser.rl
index 1347b40..e0dde39 100644 (file)
--- a/parser.rl
+++ b/parser.rl
@@ -65,7 +65,7 @@ using namespace std;
             block_stack.push_back(tmp_block);
             fcall main;
         } else {
-            fatal("%s: %d: Syntax Error: Nesting Too Deep at '}'", curfile, curline);
+            fatal("%s: %d: Syntax Error: Nesting Too Deep at '{'", curfile, curline);
         }
     }
 
@@ -110,9 +110,9 @@ using namespace std;
     newline = '\n' @newline;
     comment = '#' (any - '\n')* newline;
     whitespace = [\t\v\f\r ] | comment | newline;
-    profile = alpha (alpha | digit | '-' | '+' | '.')*;
+    profile = alpha (alpha | digit | '-' | '_' | '+' | '.')*;
     package_name = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >strstart;
-    predicate = '@' ('!'? profile) >strstart %predicate whitespace+;
+    predicate = '@' ('!'? profile ('/' '!'? profile)*) >strstart %predicate whitespace+;
     package_alternates = package_name >strstart %add_alternate ('/' package_name >strstart %add_alternate)*;
     package_list = ((whitespace+ predicate* package_alternates)+ %add_package whitespace*);
     profile_list = (whitespace+ profile >strstart %profile)* whitespace*;
@@ -129,7 +129,7 @@ using namespace std;
 
 %% write data;
 
-void badsyntax(const char *filename, int lineno, char badchar, const char *message) {
+static void badsyntax(const char *filename, int lineno, char badchar, const char *message) {
     if (!message) {
         if (badchar == '\n')
             message = "Unexpected newline";
@@ -179,7 +179,7 @@ void parser(const char *filename, inapt_block *top_block)
     %% write init;
 
     while (!done) {
-        char *p = buf + have, *pe, *eof = 0;
+        char *p = buf + have, *pe;
         int len, space = BUFSIZE - have;
 
         if (!space)
@@ -191,7 +191,6 @@ void parser(const char *filename, inapt_block *top_block)
         pe = p + len;
 
         if (!len) {
-            eof = pe;
             done = 1;
         }
 
@@ -210,7 +209,7 @@ void parser(const char *filename, inapt_block *top_block)
     }
 
     if (cs < inapt_first_final)
-        badsyntax(curfile, curline, 0, "Unexpected EOF");
+        badsyntax(curfile, curline, 0, "Unexpected EOF (forgot semicolon?)");
 
     if (top)
         badsyntax(curfile, curline, 0, "Unclosed block at EOF");