From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/lib/racc/rdoc/grammar.en.rdoc | 219 +++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 jni/ruby/lib/racc/rdoc/grammar.en.rdoc (limited to 'jni/ruby/lib/racc/rdoc/grammar.en.rdoc') diff --git a/jni/ruby/lib/racc/rdoc/grammar.en.rdoc b/jni/ruby/lib/racc/rdoc/grammar.en.rdoc new file mode 100644 index 0000000..a154246 --- /dev/null +++ b/jni/ruby/lib/racc/rdoc/grammar.en.rdoc @@ -0,0 +1,219 @@ += Racc Grammar File Reference + +== Global Structure + +== Class Block and User Code Block + +There are two blocks on toplevel. One is 'class' block, another is 'user code' +block. 'user code' block MUST be placed after 'class' block. + +== Comments + +You can insert comments about all places. Two style comments can be used, Ruby style '#.....' and C style '/\*......*\/'. + +== Class Block + +The class block is formed like this: + + class CLASS_NAME + [precedance table] + [token declarations] + [expected number of S/R conflicts] + [options] + [semantic value convertion] + [start rule] + rule + GRAMMARS + +CLASS_NAME is a name of parser class. This is the name of generating parser +class. + +If CLASS_NAME includes '::', Racc outputs module clause. For example, writing +"class M::C" causes creating the code bellow: + + module M + class C + : + : + end + end + +== Grammar Block + +The grammar block describes grammar which is able to be understood by parser. +Syntax is: + + (token): (token) (token) (token).... (action) + + (token): (token) (token) (token).... (action) + | (token) (token) (token).... (action) + | (token) (token) (token).... (action) + +(action) is an action which is executed when its (token)s are found. +(action) is a ruby code block, which is surrounded by braces: + + { print val[0] + puts val[1] } + +Note that you cannot use '%' string, here document, '%r' regexp in action. + +Actions can be omitted. When it is omitted, '' (empty string) is used. + +A return value of action is a value of left side value ($$). It is value of +result, or returned value by `return` statement. + +Here is an example of whole grammar block. + + rule + goal: definition rules source { result = val } + + definition: /* none */ { result = [] } + | definition startdesig { result[0] = val[1] } + | definition + precrule # this line continues from upper line + { + result[1] = val[1] + } + + startdesig: START TOKEN + +You can use the following special local variables in action: + +* result ($$) + +The value of left-hand side (lhs). A default value is val[0]. + +* val ($1,$2,$3...) + +An array of value of right-hand side (rhs). + +* _values (...$-2,$-1,$0) + +A stack of values. DO NOT MODIFY this stack unless you know what you are doing. + +== Operator Precedence + +This function is equal to '%prec' in yacc. +To designate this block: + + prechigh + nonassoc '++' + left '*' '/' + left '+' '-' + right '=' + preclow + +`right` is yacc's %right, `left` is yacc's %left. + +`=` + (symbol) means yacc's %prec: + + prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' + preclow + + rule + exp: exp '*' exp + | exp '-' exp + | '-' exp =UMINUS # equals to "%prec UMINUS" + : + : + +== expect + +Racc has bison's "expect" directive. + + # Example + + class MyParser + rule + expect 3 + : + : + +This directive declares "expected" number of shift/reduce conflicts. If +"expected" number is equal to real number of conflicts, Racc does not print +conflict warning message. + +== Declaring Tokens + +By declaring tokens, you can avoid many meaningless bugs. If declared token +does not exist or existing token does not decleared, Racc output warnings. +Declaration syntax is: + + token TOKEN_NAME AND_IS_THIS + ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST + +== Options + +You can write options for Racc command in your Racc file. + + options OPTION OPTION ... + +Options are: + +* omit_action_call + +omits empty action call or not. + +* result_var + +uses local variable "result" or not. + +You can use 'no_' prefix to invert their meanings. + +== Converting Token Symbol + +Token symbols are, as default, + + * naked token string in Racc file (TOK, XFILE, this_is_token, ...) + --> symbol (:TOK, :XFILE, :this_is_token, ...) + * quoted string (':', '.', '(', ...) + --> same string (':', '.', '(', ...) + +You can change this default by "convert" block. +Here is an example: + + convert + PLUS 'PlusClass' # We use PlusClass for symbol of `PLUS' + MIN 'MinusClass' # We use MinusClass for symbol of `MIN' + end + +We can use almost all ruby value can be used by token symbol, +except 'false' and 'nil'. These cause unexpected parse error. + +If you want to use String as token symbol, special care is required. +For example: + + convert + class '"cls"' # in code, "cls" + PLUS '"plus\n"' # in code, "plus\n" + MIN "\"minus#{val}\"" # in code, \"minus#{val}\" + end + +== Start Rule + +'%start' in yacc. This changes start rule. + + start real_target + +== User Code Block + +"User Code Block" is a Ruby source code which is copied to output. There are +three user code blocks, "header" "inner" and "footer". + +Format of user code is like this: + + ---- header + ruby statement + ruby statement + ruby statement + + ---- inner + ruby statement + : + : + +If four '-' exist on line head, Racc treat it as beginning of user code block. +The name of user code block must be one word. -- cgit v1.2.3