1 \r@ test-ex
\r@ $
\r@ strbuff
\r@ codeblock state
\r# $(),<(),>(),()
\r# func () {}
\r@ token combine
\r@ envar
\r# token-queue/gmr
\r# syntax
\r# expanssion
\r@ string(``,env,$())
\r@ expr: expr-assign & env-assign & cmd
\r# cmd & expr-assign,= token proc,set in expr-state
\r# statement-token + (,set in expr-state
\r# [],set expr-state
\r@
\r@ dollar
\r@ macro
\r# const-lxr
\r# macro(if/define/include/pragma)
\r# this doc(proc in <<)
\r@ cmd & var-def,type/innerfunc/loadable/cmd
\r@
\r@ stridx,symbtbl
\r@ macro-expanssion switch
\r@ '' "" string auto translation switch(macro&cmd)
\r\r@ assign & expr
\r# 在code-state中,对于两个token之间包含blank的token缓存到队列。
\r# 当有=或+=时,设置env-assign-flag,
\r# -=,*=,/=等,设置expr-assign-flag
\r# =()或+=()时,进行()的字符串匹配,保存()中的字符串,在gmr中,如果env-assign为expr-assign,不进行env-assign,进行expr-assign。如果为expr-assign,将env-assign解析为expr-assign。
\r# 当一个token与上一个token之间包含blank时,判断是否有env-assign-flag,带flag时,合并为ENVASSIGN
\r# 当包含env/expr-assign-flag时,切换到expr状态
\r# 在expr状态下,连续两个T_WORD时,或;时,返回到上一状态,并返回一个T_STOP_EXPR的 TOKEN,用于从expr的gmr中返回,并忽略该token。
\r#
\r\r@ token queue,combine & filter & state
\r# T_WORD & string & const combine
\r# first-token,end-token,
\r# cmnt: cmnt-hdr,cmnt
\r# macro: macro-token,nl
\r# envar: $,}
\r# 两个T_WORD时,first token是否为type,非type为cmd,type为vardef/funcdef
\r?# expr1: =,;
\r?# expr2: env-assign(:=,?=),;
\r# expr3: (,)
\r# two T_WORD return from expr to upper state,except in () flag。this can compatiable with cmdline。
\r\r@ func-codeblock
\r# {} after ()
\rcmd
\r( cmd param )
\r{ cmd param; }
\r# func
\r+ param define between () and {}
\r+ func name and param ( in different line
\r+
\r\r@ ()
\r# sub-script,() or $() or <() or >(), in codeblock-state
\r# param-def & ivk-param in expr-state
\r# expr in expr-state
\r# type cast in expr-state
\r\r@
\r# cort
\r# init,只在初始化运行单次
\r\r\r@ dollar,cmnt,string,codeblock。test-ex
\r# cmnt
\r+ #,//,single line comment,or macro statement
\r# comment example
\r#define aaa 111
\r// comment example.
\r//comment example.
\rcmd param // comment
\rcmd param #define aaa 111
\r+ /* */,/** **/,multi line cmnt
\r/*
\r* \func: testfunc
\r*/
\r/** comment. **/
\rcmd param /** comment. **/
\r# cmnt-state: /**/
\r+ \,@,::,:
\r/*
\r* @func: testfunc
\r* \note:: describe string.
\r* describe string in second line.
\r*/
\r# $:
\r+ #,*,@,?,$,!,
\r+ $"",$'',$``,
\r+ $(),codeblock-state
\r+ $(()),$[],expr-state
\r+ envar-state: ${},
\r${var}
\r${var[0]}
\r${#var}
\r${#var[0]}
\r${!var}
\r${!var[0]}
\r${var:0:1}
\r${var[0]:0:1}
\r${var:-value}
\r${var:=value}
\r${var:?value}
\r${var:+value}
\r${var:-value}
\r${var:=value}
\r${var:?value}
\r${var:+value}
\r${var:+"str"}
\r${var:+'str'}
\r${var:+`cmd param`}
\r${var[0]:0:1}
\r${var[0]:0:1//test/#-/@()=_[]+:}
\r${var[0]:0:1/=_[/]}
\r${var[0]:0:1#*aaa}
\r${var[0]:0:1##*aaa}
\r${var[0]:0:1%*aaa}
\r${var[0]:0:1%%*aaa}
\r${var[0]:0:1^^}
\r${var[0]:0:1,,}
\r# string
\r+ '',``,$'',$``,readuntil string
\r'test string \'
\r`cmd param <>&-`
\r$'test\n'
\r+ string-state: "",$"",
\r"abc${xxx}aaa"
\r"abc`echo x`xxx"
\r"abc$(echo x)xxx"
\r"abc`echo "str"x`xxx"
\r"abc$(echo "str"x)xxx"
\r# codeblock-state:
\r+ $(),
\r$(echo xxx"$aaa")
\r+ <(),
\rcat <(echo xxx"$aaa")
\r+ >(),
\rexho xxx | tee >(cat -)
\r+ {},
\rfoo () {
\r}
\rfoo2 ()
\r{
\r}
\r# expr-state: $(()),$[],()
\r+ +-*/%,=,|&~^,!,&&,||,<<,>>,++,--,,,.,->,=>,::,(),{},[],$,"",'',``,
\r\r@ state(tbl,proc-func,test-ex)
\r# cmdcode(c & sh token)
\r# *dollar(pfx-char)
\r# envar(!,#,[],:,-,+,=,?,:-,:?,:=,:+,/,//,#,##,%,%%,^^,,,,"",'',``,[])(pfx,name-str,array-idx,opr,opr-content)
\r# string($,``,)
\r# codeblock("",'',``,$,(),{})macro
\r# expr
\r# cmnt(\,@,::,:)
\r\r@
\r# token-tbl
\r# state & state-stack
\r# flag
\r# caching-buff
\r# queue
\r#
\r\r@ lang-elem & token
\r# comment
\r# macro
\r# cmd(env-assign token)
\r# expr-assign(var-init)
\r# codeblock/subscript
\r# statement(statement,)
\r# declaration
\r# const(string)
\r# func-def
\r# var-def
\r# type-def
\r# invoke
\r#
\r\r@ lxrgmr
\r# envar,by code
\r# const,lxr
\r# expr,lxr/gmr
\r# main-gmr,gmr
\r# *vardef-gmr
\r#
\r\r@ macro定义的expanssion,使用设置进行开关
\r# "#xxx"进行macro的expanssion,避免所有word进行macro定义的字符串比较。
\r# sizeof/typeof/以rsv-wd定义,以macro函数expanssion。
\r#
\r\r@ const
\r# blank/newline seperated T_WORD
\r# regex => lxr func after combine
\r# string
\r# digit
\r# oct,0started
\r# hex,0started
\r# bin,
\r# float
\r\r@ expanssion
\r# 输出到指定offset的buffer,根据expanssion时的state输出到不同buff。
\r# envar expanssion
\r# subscript expanssion
\r# macro expanssion
\r#
\r\r\r@
\r# txt
\r+ '',``,read until pair-char
\r+ sh/c99-singleline,read until nl。
\r+ thisdoc/helpdoc,read until term-str
\r+ block-str({},(),$/</>)只进行pair-char的计数,匹配到right-pattern时,即是一个block。
\r+ process pfx-char,count pairchar,when level = 0,read until end-str,
\r# token combine
\r# cmnt
\r+ sh/c99-singleline,read until nl。
\r+ c-preproc,chk in sh-cmnt
\r+ c89/ext-multiline,使用Txt_xxx,只匹配/**/和/****/。
\r# dollar,$为pfx,设置pair-flag
\r+ (),$(),param-state,code-state
\r+ (()),$(()),calc-state
\r+ $[],calc-state
\r+ [[]],$[[]],sh-judge,calc-state
\r+ ${},
\r+ $"",$'',$``,在"",'',``之后运行exit响应函数时,根据$标记对字符串进行处理。
\r# quoted-str
\r+ "",``,$的混合
\r\r# code/cmd/expr-state,;/nl,first token为T_WORD的表示cmd,为token的code状态。在()或(())中为expr状态。
\r# code
\r+ '',"",``,
\r+ (),{}
\r+ statement/cmd/expr的判断
\r- code状态下,第一个token为非T_WORD时,即是statement,仍以code状态运行。
\r- 开头的token为T_WORD,第二个token非=时,为cmd状态
\r- 第二个token为'='时,=之前的blank为0,且T_WORD不是变量名称,将两个token输出为T_ENVASSIGN,并设置cmd状态。
\r- 当第二个token为=,且非T_ENVASSIGN时,为expr状态
\r- @开头的语句,为var状态,根据.和->和::和=>获取var的member,return一个T_ATVAR的token,并设置为expr状态。
\r- expr状态以;切换到code状态。
\r- nl,或;,或&,或&&,或||时,从cmd状态返回到code状态
\r- source或include时,保存状态,new-file以code状态使用。
\r#
\r\r@ token的combine
\r# 在token读取函数之外添加wrap,对token进行处理。
\r# word combine
\r# string combine
\r# ENVASSIGN combine
\r# var name combine
\r#
\r\r@ code
\r# code
\r# cmd
\r# func-def
\r# assign
\r# expr
\r# string
\r# cmnt/macro
\r#
\r\r@ cmd statement
\r# first token is word,second token is not ( or . or =。
\r# wordlist
\r# ;,nl
\r# &&,||
\r# &
\r# |,<,>
\r#
\r\r@ regrx-str,在cmd状态时,以[[:blank:]]为seperator
\r# second token进行"(","+=","=","+=(","=("的识别,并根据token之前的blank,判断是否为assignment,切换到不同的状态
\r#
\r\r@
\r# {},()
\r# then/else/elif/fi
\r# do/done
\r# [[/]]
\r\r@ elem
\r# declaration,
\r# var-def,declaration_specifiers
\r# func-def,function_definition
\r# type-def,declaration_specifiers
\r# macro-def,
\r# statement(compound)
\r+ declaration/var-def/type-def/macro-def
\r+ assignment,assignment_expression
\r+ func-ivk,postfix_expression
\r+ compound,compound_statement
\r+ gmr-statement,statement
\r+ *cmd-statement
\r#
\r#
\r#
\r\r@ assignment
\r# cmd的=后面是字符串,c语言的=后面是运行操作。
\r# "[[:alnum:]_]*=(",var=(1 2 3)和var=(int*)ptr;,chk env name,在lxr中返回assign_quote,在gmr中对这个token之后的token解析,来设置assign的类型。(env_arr,var)
\r# "[[:alnum:]_]*=[^\ ]",如果=之前为env,使用cmd的assign。如果为dvar或external-symbol,使用lang-assign,=及后面的字符unput,当前word为T_VAR。
\r# 含"()"类型转换的assign时,"("的解析,如包含T_WORD,并且是变量type类型时,设置convert的state,其它的设置subscript。
\r# 含xxx.xxx的submember的assign,token在gmr中组织为语句。
\r#
\r\r@ global
\r# global的初始化,在init()或模块文件名同名的函数中初始化。
\r#
\r\r@ env与var
\r# env看成是字符串类型的var。使用$envar为const的字符串,使用@envar为字符串的ptr,@envar与var一样使用
\r\r@ 函数参数
\r# cmd-style的调用,对于c-func,进行类型转换
\r# 参数定义为型参,同时以$n访问参数字符串
\r# 对于参数定义个数之外的,以$n访问。
\r# 函数调用时"($@)"将参数"duplicate"到调用函数的参数区。
\r\r\r@ 根据if/for语句,浏览expr和statement的定义。
\r# expr
\r# statement,根据定义中包含';'的项,浏览statement定义。
\r+ compound_statement
\r+ expression_statement
\r+ selection_statement,iteration_statement
\r+ labeled_statement,jump_statement
\r# declaration/declaration_specifiers
\r+ storage_class_specifier(TYPEDEF,EXTERN,STATIC,AUTO,REGISTER)
\r+ type_specifier(VOID,CHAR,SHORT,INT,LONG,FLOAT,DOUBLE,SIGNED,UNSIGNED,struct_or_union_specifier,enum_specifier,TYPE_NAME)
\r+ type_qualifier(CONST,VOLATILE)
\r# ()
\r\r@
\r# statement
\r: labeled_statement
\r| compound_statement
\r| expression_statement
\r| selection_statement
\r| iteration_statement
\r| jump_statement
\r;
\r# expression
\r: assignment_expression
\r| expression ',' assignment_expression
\r;
\r# primary_expression
\r: IDENTIFIER
\r| CONSTANT
\r| STRING_LITERAL
\r| '(' expression ')'
\r;
\rpostfix_expression
\r: primary_expression
\r| postfix_expression '[' expression ']'
\r| postfix_expression '(' ')'
\r| postfix_expression '(' argument_expression_list ')'
\r| postfix_expression '.' IDENTIFIER
\r| postfix_expression PTR_OP IDENTIFIER
\r| postfix_expression INC_OP
\r| postfix_expression DEC_OP
\r;
\r#
\r\r\r \r\r