docs: public final EObject rulePrefixExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          EObject lv_expression_2_0 = null;
  
          EObject this_Atom_3 = null;
  
  
           enterRule(); 
              
          try {
              // InternalSimpleExpressions.g:361:28: ( ( ( () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) ) ) | this_Atom_3= ruleAtom ) )
              // InternalSimpleExpressions.g:362:1: ( ( () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) ) ) | this_Atom_3= ruleAtom )
              {
              // InternalSimpleExpressions.g:362:1: ( ( () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) ) ) | this_Atom_3= ruleAtom )
              int alt6=2;
              int LA6_0 = input.LA(1);
  
              if ( (LA6_0==21) ) {
                  alt6=1;
              }
              else if ( ((LA6_0>=RULE_INT && LA6_0<=RULE_ID)||LA6_0==13||(LA6_0>=22 && LA6_0<=23)) ) {
                  alt6=2;
              }
              else {
                  NoViableAltException nvae =
                      new NoViableAltException("", 6, 0, input);
  
                  throw nvae;
              }
              switch (alt6) {
                  case 1 :
                      // InternalSimpleExpressions.g:362:2: ( () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) ) )
                      {
                      // InternalSimpleExpressions.g:362:2: ( () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) ) )
                      // InternalSimpleExpressions.g:362:3: () otherlv_1= '!' ( (lv_expression_2_0= ruleAtom ) )
                      {
                      // InternalSimpleExpressions.g:362:3: ()
                      // InternalSimpleExpressions.g:363:5: 
                      {
  
                              current = forceCreateModelElement(
                                  grammarAccess.getPrefixExpressionAccess().getNotExpressionAction_0_0(),
                                  current);
                          
  
                      }
  
                      otherlv_1=(Token)match(input,21,FOLLOW_5); 
  
                          	newLeafNode(otherlv_1, grammarAccess.getPrefixExpressionAccess().getExclamationMarkKeyword_0_1());
                          
                      // InternalSimpleExpressions.g:372:1: ( (lv_expression_2_0= ruleAtom ) )
                      // InternalSimpleExpressions.g:373:1: (lv_expression_2_0= ruleAtom )
                      {
                      // InternalSimpleExpressions.g:373:1: (lv_expression_2_0= ruleAtom )
                      // InternalSimpleExpressions.g:374:3: lv_expression_2_0= ruleAtom
                      {
                       
                      	        newCompositeNode(grammarAccess.getPrefixExpressionAccess().getExpressionAtomParserRuleCall_0_2_0()); 
                      	    
                      pushFollow(FOLLOW_2);
                      lv_expression_2_0=ruleAtom();
  
                      state._fsp--;
  
  
                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPrefixExpressionRule());
                      	        }
                             		set(
                             			current, 
                             			"expression",
                              		lv_expression_2_0, 
                              		"org.eclipse.xtext.xtext.generator.parser.antlr.splitting.SimpleExpressions.Atom");
                      	        afterParserOrEnumRuleCall();
                      	    
  
                      }
  
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSimpleExpressions.g:392:5: this_Atom_3= ruleAtom
                      {
                       
                              newCompositeNode(grammarAccess.getPrefixExpressionAccess().getAtomParserRuleCall_1()); 
                          
                      pushFollow(FOLLOW_2);
                      this_Atom_3=ruleAtom();
  
                      state._fsp--;
  
                       
                              current = this_Atom_3; 
                              afterParserOrEnumRuleCall();
                          
  
                      }
                      break;
  
              }
  
  
              }
  
               leaveRule(); 
          }
           
              catch (RecognitionException re) { 
                  recover(input,re); 
                  appendSkippedTokens();
              } 
          finally {
          }
          return current;
      }