OsfV3Rules.grm

// FILE. . . . . /home/hak/hlt/src/hlt/osf/apps/v3/sources/OsfV3Rules.grm
// EDIT BY . . . Hassan Ait-Kaci
// ON MACHINE. . Hak-Laptop
// STARTED ON. . Sun Mar 29 16:07:43 2015



Copyright:  © by the author
Author:  Hassan Aït-Kaci
Version:  Last modified on Sun Mar 31 06:16:13 2019 by hak



/* ************************************************************************ */
/* **************************** GRAMMAR RULES ***************************** */
/* ************************************************************************ */

%%



OsfV3Program is the grammar's start symbol. It denotes an OSF V3 program, which consists in a sequence of Statement constructs.


OsfV3Program
  : Statements_opt 
  ;



A Statements_opt is a possibly empty sequence of Statement constructs.


Statements_opt
  : // Empty programs are ok. */
  | Statements_opt Statement
  ;



A Statement is StatementType followed by an end of statement marker.


Statement
  : StatementType EndOfStatement
  ;



EndOfStatement denotes the end of a statement. Upon the end of statement marker EOS the statement is processed and errors that may have occurred are reported. In interactive mode, it also triggers a prompt for additional statements. In case of syntax error, error recovery skips all input until the next end-of-statement marker EOS.


EndOfStatement
  : {
      commitParse();
    }
    EOS
  ;



A StatementType is the main language unit, an element of the sequence of statements that make up an OSF V3 program. It can be one of the following:
  • A Pragma statement:
    Extra-language commands for user interaction conveniences.
  • A Sort declaration statement:)
    To declare how sorts are related in the concept taxonomy.
  • An OSF Expression evaluation statement:
    To enter an expression to evaluate and print the result.
  • An Empty statement:
    This has no effect: it is simply skipped.
  • Error statement:
    This rule is needed to enable error recovery à la yacc. This is what makes Statement a unit of parsing for OSF V3: in case of syntax error, OSF V3's parser ignores everything past the last successfully parsed Statement and up to the next end-of-statement marker: a period ('.'), also known as the terminal symbol EOSEnd Of Statement).



StatementType
  : // Empty statements are ok. */
  | PragmaStatement 
  | SortDeclarationStatement
  | OsfExpression
  | error
  ;

SortDeclarationStatement
  : IsaDeclarationStatement
    {
      setLocation();
      processIsaDeclaration($1.lhs,$1.rhs);
    }
  // | SortNameDeclarationStatement
  //   {
  //     setLocation();
  //     processtSortNameDeclaration($1.symbols);
  //   }
  ;

IsaDeclarationStatement
  : SortSymbols ISA SortSymbols
    {
      $$.lhs = $1.symbols;
      $$.rhs = $3.symbols;
    }
  ; 

// SortNameDeclarationStatement
//   : DECLARESORTS SortSymbols
//     {
//       $$.symbols = $2.symbols;
//     }      
//   ;

SortSymbol
  : IDENTIFIER
  ;

SortSymbols
  : SortSymbol
    {
      $$.symbols = new Stack();
      $$.symbols.push($1.svalue());
    }
  | SortSymbol ',' SortSymbols
    {
      ($$.symbols = $3.symbols).push($1.svalue());
    }
  ;

OsfExpression
  :
  //   SortExpression
  //   {
  //     processSortExpression($1.expression);
  //   }
  // | 
    PsiTerm
    {
      processPsiTerm($1.tag,$1.sort,$1.keys,$1.subterms);
    }
  ;

PsiTerm
  : TAG
    {
      $$.tag = $1.svalue();
      $$.sort = new SymbolSortExpression("@",context);
    }
    // XML serialization:
    [ n:"osf" l:"term" a:{tag=1/value} ]
  | UntaggedPsiTerm
    {
      $$.sort = $1.sort;
      $$.keys = $1.keys;
      $$.subterms = $1.subterms;
    }
  | TAG ':' UntaggedPsiTerm
    {
      $$.tag = $1.svalue();
      $$.sort = $3.sort;
      $$.keys = $3.keys;
      $$.subterms = $3.subterms;
    }
    // XML serialization:
    [ n:"osf" l:"term" a:{tag=1/value} c:(3[0]) ]
  ;

UntaggedPsiTerm
  : SortExpression Body_opt
    {
      $$.sort = $1.expression;
      $$.keys = $2.keys;
      $$.subterms = $2.subterms;
    }
    // XML serialization:
    [ n:"osf" l:"term" c:(1 2) ]
  ;

Body_opt
  : /* empty */
  | '(' SubTerms ')'
    {
      $$.keys = $2.keys;
      $$.subterms = $2.subterms;
    }
  ;

SubTerms
  : SubTerm
    {
      $$.keys = new Stack();
      $$.keys.push($1.key);
      $$.subterms = new Stack();
      $$.subterms.push($1.psiterm);
    }
  | SubTerm ',' SubTerms
    {
      ($$.keys = $3.keys).push($1.key);
      ($$.subterms = $3.subterms).push($1.psiterm);
    }
  ;

SubTerm
  : PsiTerm
    {
      $$.key = null;
      $$.psiterm = new RawPsiTerm($1.tag,$1.sort,$1.keys,$1.subterms);
    }
  | Feature ARROW PsiTerm
    {
      $$.key = $1.feature;
      $$.psiterm = new RawPsiTerm($3.tag,$3.sort,$3.keys,$3.subterms);
    }
    // XML serialization:
    [ n:"osf" l:"feature" a:{name=1/value} c:(3) ]
  ;

Feature
  : INTEGER
    {
      $$.feature = Integer.valueOf((int)$1.nvalue());
    }
  | IDENTIFIER
    {
      $$.feature = $1.svalue();
    }
  ;

SortExpression
  : Constant
    {
      $$.expression = new ConstantSortExpression($1.constant);
    }
  | Sort
    {
      $$.expression = new SymbolSortExpression($1.svalue(),context);
    }
  | '{' SortList '}'
    {
      $$.expression = new DisjunctiveSort($2.sortList,context);
    }
    // XML serialization:
    [ n:"osf" l:"disjunction" c:(2) ]
  | NOT SortExpression
    {
      $$.expression = new NotSortExpression($2.expression);
    }
    // XML serialization:
    [ n:"osf" l:"not" c:(2) ]
  | SortExpression AND SortExpression
    {
      $$.expression = new AndSortExpression($1.expression,$3.expression);
    }
    // XML serialization:
    [ n:"osf" l:"and" c:(1 3) ]
  | SortExpression OR SortExpression
    {
      $$.expression = new OrSortExpression($1.expression,$3.expression);
    }
    // XML serialization:
    [ n:"osf" l:"or" c:(1 3) ]
  | SortExpression BUTNOT SortExpression
    {
      $$.expression = new ButnotSortExpression($1.expression,$3.expression);
    }
    // XML serialization:
    [ n:"osf" l:"butnot" c:(1 3) ]
  | '(' SortExpression ')'
    {
      $$.expression = $2.expression.setParenthesized(true);
    }
    // XML serialization:
    [ n:"osf" l:"parenthesis" c:(2) ]
  ;

Constant
  : INTEGER
    { $$.constant = new IntegerConstant((int)$1.nvalue()); }
  | CHAR // should check that there's exactly one character!
    { $$.constant = new CharConstant($1.svalue().charAt(0)); }
  | FLOAT
    { $$.constant = new FloatConstant($1.nvalue()); }
  | STRING
    { $$.constant = new StringConstant($1.svalue()); }
  | BOOLEAN
    { $$.constant = new BooleanConstant($1.svalue() == "true" ? true : false); }
  // | 'null'
  //   { $$.constant = Constant.NULL(); }
  ;

Sort
  : TOP
  | BOTTOM
  | IDENTIFIER
    // XML serialization:
    [ n:"osf" l:"sort" a:{symbol=1/value} ]
  ;

SortList
  : Sort
    {
      ($$.sortList = new Stack()).push($1.svalue());
    }
  | Sort ';' SortList
    {
      ($$.sortList = $3.sortList).push($1.svalue());
    }
  ;

// /**
//  * This non-terminal denotes statements used to define a global
//  * name associated to a ψ-term.
//  */
// DefinitionStatement
//   : DEF '=' PsiTerm
//   {
//     processDefinition($1.name,$3.psiterm);
//   }
//   ;
   


This node stands for a pragma statement which allows the user to query state parameters or up some options using a few built-in extra-language commands of the form %pragma where pragma is an identifier, possibly followed with arguments, and always terminated with a dot (".").

A (partial) list of pragmas to be supported eventually is:

Pragma Statement Caused Effect
%help List this information.
%exit End the session and exit OSF V3.
%include filename Read and process the contents of the file (name specified as a quoted string)
%encode Trigger the encoding of the current sort hierarchy.
%sorts Display all sorts as a bitcode array (must come after %encode.).
%defined List all the currently defined symbols.
%symbols List all the known (built-in and defined) symbols
%automatic Toggles on/off automatic sort encoding at the first expression evaluation without prompting the user. The default is to prompt the user.
%mute Toggle on/off result displays.
%size Print the number of concepts in the sort hierarchy.
%height Print the height of the sort hierarchy; that is, the length of the longest is-a concept chain from {} to @.
%width Print the size of the widest is-a concept cochain; that is, the size of the largest set of mutually unrelated concepts in the hierarchy.
%children s Prints the set of immediate subconcepts of s; in other words, the set of strict greatest lower bounds of s.
%descendants s Print the set of all strict lower bounds of s; in other words, the set of all subconcepts of s besides itself nor {}, or {} if s is immediately above {}.
%parents s Print the set of immediate superconcepts of s; in other words, the set of strict least upper bounds of s; besides @, or @ if s is immediately below @.
%ancestors s Print the set of all superconcepts of s; in other words, the set of all strict upper bounds of s besides @, or @ if s is immediately below @.
%enumsize n Sets to n the size of disjunctive enumerations to display (number of symbols before etc., ...). Default is 10.
%isa s t Return true if s is a subconcept of t, and false otherwise.
%refresh Erase the codes for all known sorts. After this pragma has been invoked, new sort declarations and variable definitions may then be added those previously recorded, and then the hierarchy may be reencoded.
%tree Toggle on/off display of syntax tree.
%timing Toggle on/off execution timing.
%gc Force immediate garbage collection.
%syntax Toggle on/off parser tracing.
%trace Toggle on/off evaluation tracing.


PragmaStatement
  : HELP_PRAGMA // %help
    {
      setLocation();
      helpPragma();
    }
  | EXIT_PRAGMA // %exit
    {
      setLocation();
      OsfV3Main.exit();
    }
  | INCLUDE_PRAGMA FileList // %include
    {
      setLocation();
      includeFiles($2.files);
    }
  | ENCODE_PRAGMA // %encode
    {
      setLocation();
      displaySize();
      encodeSorts();
    }
  | EVAL_PRAGMA // %eval
    {
      setLocation();
      PsiTerm.evaluateSorts(true);
      displayLine("*** Sort expression evaluation has been turned on...");
    }
  | SORTS_PRAGMA // %sorts
    {
      setLocation();
      displaySorts();
    }
  | DEFINED_PRAGMA // %defined
    {
      setLocation();
      // to do
    }
  | SYMBOLS_PRAGMA // %symbols
    {
      setLocation();
    }
  | MUTE_PRAGMA // %mute
    {
      setLocation();
      isMute = !isMute;
      display("Muted output has been turned "+(isMute ? "on" : "off")+"...\n");
      if (isMute) displayLine("*** ...");
    }
  | SIZE_PRAGMA // %size
    {
      setLocation();
      displaySize();
    }
  | HEIGHT_PRAGMA // %height
    {
      setLocation();
      // to do
    }
  | WIDTH_PRAGMA // %width
    {
      setLocation();
      // to do
    }
  | CHILDREN_PRAGMA SortExpression // %children
    {
      setLocation();
      displayChildren($2.expression);
    }
  | DESCENDANTS_PRAGMA SortExpression // %descendants
    {
      setLocation();
      showDescendants($2.expression);
    }
  | PARENTS_PRAGMA SortExpression // %parents
    {
      setLocation();
      displayParents($2.expression);
    }
  | ANCESTORS_PRAGMA SortExpression // %ancestors
    {
      setLocation();
      showAncestors($2.expression);
    }
  | ENUMSIZE_PRAGMA INTEGER // %enumsize
    {
      setLocation();
      Decoded.setEnumSize((int)$2.nvalue());
    }
  | ISA_PRAGMA SortExpression SortExpression // %isa
    {
      setLocation();
      // to do
    }
  | REFRESH_PRAGMA // %refresh
    {
      setLocation();
      Tag.clearKnownTags();
      context.reset();
      displayLine("*** The sort taxonomy has been cleared ("+
		  numberOfSorts(context.taxonomy().size())+" defined)");
    }
  | TREE_PRAGMA // %tree
    {
      setLocation();
      parseTreeType = (showTree = !showTree) ? COMPACT_TREE : NO_TREE;
      display("Parse tree display has been turned "+(showTree ? "on" : "off")+"...\n");
    }
  | TIMING_PRAGMA // %timing
    {
      setLocation();
      Context.toggleTiming();
      displayLine("*** Processing timing has been turned "+(Context.isTiming() ? "on" : "off")+"...");
    }
  | GC_PRAGMA // %gc
    {
      setLocation();
      display("\n");
      Misc.forceGC(!isMute,dm.getOutputStream());
    }
  | SYNTAX_PRAGMA // %syntax
    {
      setLocation();
      toggleTrace();
      display("Parser trace has been turned "+(tracingIsOn() ? "on" : "off")+"...\n");
    }
  | TRACE_PRAGMA // %trace
    {
      setLocation();
      if (isMute)
	{
	  display("Cannot trace evaluation in mute mode; turn mute mode off with '%mute.'");
	  break;
	}
      Context.toggleTracing();
      display("Execution tracing has been turned "+(Context.isTracing() ? "on" : "off")+"...\n");
    }
  | UNKNOWN_PRAGMA // %unknown
    {
      setLocation();
      displayLine("*** Unknown pragma (ignored) - type '%help.' for known pragmas.");
      //      displayLine("*** Unknown pragma: '%"+pragma+"' (ignored) - type '%help.' for known pragmas.");
    }
  ;

// PragmaArguments_opt
//   : /* empty */
//   | INTEGER // integer argument to a pragma %setenum
//     {
//       Decoded.setEnumSize((int)$1.nvalue());
//     }
//   | FileList
//     {
//       $$.args = $1.files;
//     }
//   | SortExpression // argument to pragmas %parents, %ancestors, %children, %descendants, etc., ...
//     {
//       ($$.args = new Stack(1)).add($1.expression);
//     }
//   | SortExpression SortExpression // arguments to pragma %isa
//     {
//       ($$.args = new Stack(2)).add($1.expression);
//       $$.args.add($2.expression);
//     }
//   ;

FileList
  : STRING
    {
      ($$.files = new Stack()).push($1.svalue());
    }
  | STRING FileList
    {
      ($$.files = $2.files).push($1.svalue());
    }
  ;

%%

/* ************************************************************************ */
/* ************************* END OF GRAMMAR RULES ************************* */
/* ************************************************************************ */


This file was generated on Fri Aug 16 04:59:19 PDT 2019 from file OsfV3Rules.grm
by the hlt.language.tools.Hilite Java tool written by Hassan Aït-Kaci