I want to parse some assignments, where I only care about the assignment as a whole. Not about whats inside the assignment. An assignment is indiciated by ':='. (EDIT: Before and after the assignments other things may come)
Some examples:
a := TRUE & FALSE;
c := a ? 3 : 5;
b := case
a : 1;
!a : 0;
esac;
Currently I make a difference between assignments containing a ‘case’ and other assignments. For simple assignments I tried something like ~('case' | 'esac' | ';') but then antlr complained about unmatched tokens (like '=').
assignment :
NAME ':='! expression ;
expression :
( simple_expression | case_expression) ;
simple_expression :
((OPERATOR | NAME) & ~('case' | 'esac'))+ ';'! ;
case_expression :
'case' .+ 'esac' ';'! ;
I tried replacing with the following, because the eclipse-interpreter did not seem to like the ((OPERATOR | NAME) & ~('case' | 'esac'))+ ';'! ; because of the 'and'.
(~(OPERATOR | ~NAME | ('case' | 'esac')) |
~(~OPERATOR | NAME | ('case' | 'esac')) |
~(~OPERATOR | ~NAME | ('case' | 'esac'))) ';'!
But this does not work. I get
“error(139): /AntlrTutorial/src/foo/NusmvInput.g:78:5: set complement is empty |—> ~(~OPERATOR | ~NAME | (‘case’ | ‘esac’))) EOC! ;”
How can I parse it?
There are a couple of things going wrong here:
&in your grammar while it should be with quotes around it:'&'~and.(especially not.+!) inside parser rules: use them in lexer rules only;'case'and'esac'in your parser rules (it’s safe to use literal tokens in your parser rules if no other lexer rule can potentially match is, but'case'and'esac'look a lot likeNAMEand they could end up in your AST in which case it’s better to explicitly define them yourself in the lexer)Here’s a quick demo:
which will parse your input:
as follows: