variations on a theme
This is the groklm experiment, which is one of several variations on a theme:
translate to lispy-schemey prefix notation: | groklm_experiment |
translate to 3-address notation: | grokreg_experiment |
a filtering translator to lispy-schemey prefix notation: | grokout_experiment |
build and run the groklm ruleset
Here is the groklm.lmn ruleset as a web page: groklm
Compile the groklm ruleset as a shebang script called groklm.lm:
[user@machine web]$ make groklm.lm lmn2m -o groklm.lm -s /usr/bin/lm groklm.lmn chmod +x groklm.lm
Try it with normal output:
[user@machine web]$ ./groklm.lm a = B + (1 - 1/x) * 2; C (set a (add B (mul (sub 1 (div 1 x)) 2)))
Try it with diagram output - the -W 60 specifies the width of the diagram, and must precede the -t D which specifes tracing in diagram output style:
[user@machine web]$ ./groklm.lm -W 60 -t D a = B + (1 - 1/x) * 2; eof 'a' ? eof 'a' .----------------------000001 | expr 'a' |? expr 'a' |.---------------------000002 || opnd 'a' ||? opnd 'a' ||.--------------------000003 ||| % ' ' ||| repeat ' ' ||| [a-zA-z_] ' ' |||? [a-zA-z_] ' ' |||- [a-zA-z_] ' ' ||| toSym ' ' ||| : ' ' ||'--------------------000003---------- ----------000003-----------------------. || opnd opnd | || : : | || 000003-----------------------' || op ' ' ||? op ' ' || op '=' ||? op '=' ||.--------------------000006 ||| expr ' ' |||? expr ' ' ||| expr 'B' |||? expr 'B' |||.-------------------000008 |||| opnd 'B' ||||? opnd 'B' ||||.------------------000009 ||||| % ' ' ||||| repeat ' ' ||||| [a-zA-z_] ' ' |||||? [a-zA-z_] ' ' |||||- [a-zA-z_] ' ' ||||| toSym ' ' ||||| : ' ' ||||'------------------000009---------- ----------000009-----------------------. |||| opnd opnd | |||| : : | |||| 000009-----------------------' |||| op ' ' ||||? op ' ' |||| op '+' ||||? op '+' ||||.------------------000012 ||||| expr ' ' |||||? expr ' ' ||||| expr '(' |||||? expr '(' |||||.-----------------000014 |||||| opnd '(' ||||||? opnd '(' ||||||.----------------000015 ||||||| expr '1' |||||||? expr '1' |||||||.---------------000016 |||||||| opnd '1' ||||||||? opnd '1' ||||||||.--------------000017 ||||||||| % ' ' ||||||||| repeat ' ' ||||||||| [0-9] ' ' |||||||||? [0-9] ' ' |||||||||- [0-9] ' ' ||||||||| option ' ' ||||||||| '.' ' ' |||||||||? '.' ' ' |||||||||- '.' ' ' ||||||||| toNum ' ' ||||||||| : ' ' ||||||||'--------------000017---------- ----------000017-----------------------. |||||||| opnd opnd | |||||||| : : | |||||||| 000017-----------------------' |||||||| op ' ' ||||||||? op ' ' |||||||| op '-' ||||||||? op '-' ||||||||.--------------000021 ||||||||| expr ' ' |||||||||? expr ' ' ||||||||| expr '1' |||||||||? expr '1' |||||||||.-------------000023 |||||||||| opnd '1' ||||||||||? opnd '1' ||||||||||.------------000024 ||||||||||| % '/' ||||||||||| repeat '/' ||||||||||| [0-9] '/' |||||||||||? [0-9] '/' |||||||||||- [0-9] '/' ||||||||||| option '/' ||||||||||| '.' '/' |||||||||||? '.' '/' |||||||||||- '.' '/' ||||||||||| toNum '/' ||||||||||| : '/' ||||||||||'------------000024---------- ----------000024-----------------------. |||||||||| opnd opnd | |||||||||| : : | |||||||||| 000024-----------------------' |||||||||| op '/' ||||||||||? op '/' ||||||||||.------------000025 ||||||||||| expr 'x' |||||||||||? expr 'x' |||||||||||.-----------000026 |||||||||||| opnd 'x' ||||||||||||? opnd 'x' ||||||||||||.----------000027 ||||||||||||| % ')' ||||||||||||| repeat ')' ||||||||||||| [a-zA-z_] ')' |||||||||||||? [a-zA-z_] ')' |||||||||||||- [a-zA-z_] ')' ||||||||||||| toSym ')' ||||||||||||| : ')' ||||||||||||'----------000027---------- ----------000027-----------------------. |||||||||||| opnd opnd | |||||||||||| : : | |||||||||||| 000027-----------------------' |||||||||||| op ')' ||||||||||||? op ')' |||||||||||| 000028-----------------------. |||||||||||| op op | |||||||||||'-----------000026 | ||||||||||| expr expr | ||||||||||| : : | ||||||||||'------------000025---------- ----------000025----------------------.| |||||||||| op op || |||||||||'-------------000023 || ||||||||| expr opnd || |||||||||? expr opnd ?? |||||||||.-------------000029 || |||||||||| opnd opnd || |||||||||| : : || |||||||||| 000025----------------------'| |||||||||| 000028-----------------------' |||||||||| op ')' ||||||||||? op ')' |||||||||| 000030-----------------------. |||||||||| op op | |||||||||'-------------000029 | ||||||||| expr expr | ||||||||| : : | ||||||||'--------------000021---------- ----------000021----------------------.| |||||||| op op || |||||||'---------------000016 || ||||||| expr opnd || |||||||? expr opnd ?? |||||||.---------------000031 || |||||||| opnd opnd || |||||||| : : || |||||||| 000021----------------------'| |||||||| 000030-----------------------' |||||||| op ')' ||||||||? op ')' |||||||| 000032-----------------------. |||||||| op op | |||||||'---------------000031 | ||||||| expr expr | ||||||| : : | ||||||| 000032-----------------------' ||||||| ')' ')' ||||||'----------------000015---------- ----------000015-----------------------. |||||| opnd opnd | |||||| : : | |||||| 000015-----------------------' |||||| op ' ' ||||||? op ' ' |||||| op '*' ||||||? op '*' ||||||.----------------000034 ||||||| expr ' ' |||||||? expr ' ' ||||||| expr '2' |||||||? expr '2' |||||||.---------------000036 |||||||| opnd '2' ||||||||? opnd '2' ||||||||.--------------000037 ||||||||| % ';' ||||||||| repeat ';' ||||||||| [0-9] ';' |||||||||? [0-9] ';' |||||||||- [0-9] ';' ||||||||| option ';' ||||||||| '.' ';' |||||||||? '.' ';' |||||||||- '.' ';' ||||||||| toNum ';' ||||||||| : ';' ||||||||'--------------000037---------- ----------000037-----------------------. |||||||| opnd opnd | |||||||| : : | |||||||| 000037-----------------------' |||||||| op ';' ||||||||? op ';' |||||||| 000038-----------------------. |||||||| op op | |||||||'---------------000036 | ||||||| expr expr | ||||||| : : | ||||||'----------------000034---------- ----------000034----------------------.| |||||| op op || |||||'-----------------000014 || ||||| expr opnd || |||||? expr opnd ?? |||||.-----------------000039 || |||||| opnd opnd || |||||| : : || |||||| 000034----------------------'| |||||| 000038-----------------------' |||||| op ';' ||||||? op ';' |||||| 000040-----------------------. |||||| op op | |||||'-----------------000039 | ||||| expr expr | ||||| : : | ||||'------------------000012---------- ----------000012----------------------.| |||| op op || |||'-------------------000008 || ||| expr opnd || |||? expr opnd ?? |||.-------------------000041 || |||| opnd opnd || |||| : : || |||| 000012----------------------'| |||| 000040-----------------------' |||| op ';' ||||? op ';' |||| 000042-----------------------. |||| op op | |||'-------------------000041 | ||| expr expr | ||| : : | ||'--------------------000006---------- ----------000006----------------------.| || op op || |'---------------------000002 || | expr opnd || |? expr opnd ?? |.---------------------000043 || || opnd opnd || || : : || || 000006----------------------'| || 000042-----------------------' || op ';' ||? op ';' || 000044-----------------------. || op op | |'---------------------000043 | | expr expr | | : : | | 000044-----------------------' | ; ';' |? ; ';' | 000045-----------------------. | ; ; | '----------------------000001---------- ----------000001----------------------.| eof generate || ? eof generate ?? .----------------------000046 || | output C || |? output C ?? |.---------------------000047 || || code C || ||? code C ?? ||.--------------------000048 || ||| out C || C ||'--------------------000048 || || code fa || ||? code fa ?? ||.--------------------000049 || ||| : : || ||| : : || ||| variable x || |||? variable x ?? |||.-------------------000050 || |||| : : || |||'-------------------000050---------- ----------000050---------------------.|| ||| variable variable ||| ||| : : ||| ||| 000050---------------------'|| ||| : : || ||'--------------------000049---------- ----------000049---------------------.|| || code '(' ||| ||? code '(' ??? ||.--------------------000051 ||| ||| out '(' ||| ( ||'--------------------000051 ||| || code set ||| ||? code set ??? ||.--------------------000052 ||| ||| out set ||| set ||'--------------------000052 ||| || code sp ||| ||? code sp ??? || 000053--------------------.||| || code ' ' |||| ||? code ' ' ???? ||.--------------------000054 |||| ||| out ' ' |||| ||'--------------------000054 |||| || 000053--------------------'||| || code a ||| ||? code a ??? ||.--------------------000055 ||| ||| out a ||| a ||'--------------------000055 ||| || code sp ||| ||? code sp ??? || 000056--------------------.||| || code ' ' |||| ||? code ' ' ???? ||.--------------------000057 |||| ||| out ' ' |||| ||'--------------------000057 |||| || 000056--------------------'||| || code f2 ||| ||? code f2 ??? ||.--------------------000058 ||| ||| : : ||| ||| : : ||| ||| : : ||| ||'--------------------000058---------- ----------000058--------------------.||| || code '(' |||| ||? code '(' ???? ||.--------------------000059 |||| ||| out '(' |||| ( ||'--------------------000059 |||| || code add |||| ||? code add ???? ||.--------------------000060 |||| ||| out add |||| add ||'--------------------000060 |||| || code sp |||| ||? code sp ???? || 000061-------------------.|||| || code ' ' ||||| ||? code ' ' ????? ||.--------------------000062 ||||| ||| out ' ' ||||| ||'--------------------000062 ||||| || 000061-------------------'|||| || code x |||| ||? code x ???? ||.--------------------000063 |||| ||| : : |||| ||'--------------------000063---------- ----------000063-------------------.|||| || code B ||||| ||? code B ????? ||.--------------------000064 ||||| ||| out B ||||| B ||'--------------------000064 ||||| || 000063-------------------'|||| || code sp |||| ||? code sp ???? || 000065-------------------.|||| || code ' ' ||||| ||? code ' ' ????? ||.--------------------000066 ||||| ||| out ' ' ||||| ||'--------------------000066 ||||| || 000065-------------------'|||| || code f2 |||| ||? code f2 ???? ||.--------------------000067 |||| ||| : : |||| ||| : : |||| ||| : : |||| ||'--------------------000067---------- ----------000067-------------------.|||| || code '(' ||||| ||? code '(' ????? ||.--------------------000068 ||||| ||| out '(' ||||| ( ||'--------------------000068 ||||| || code mul ||||| ||? code mul ????? ||.--------------------000069 ||||| ||| out mul ||||| mul ||'--------------------000069 ||||| || code sp ||||| ||? code sp ????? || 000070------------------.||||| || code ' ' |||||| ||? code ' ' ?????? ||.--------------------000071 |||||| ||| out ' ' |||||| ||'--------------------000071 |||||| || 000070------------------'||||| || code f2 ||||| ||? code f2 ????? ||.--------------------000072 ||||| ||| : : ||||| ||| : : ||||| ||| : : ||||| ||'--------------------000072---------- ----------000072------------------.||||| || code '(' |||||| ||? code '(' ?????? ||.--------------------000073 |||||| ||| out '(' |||||| ( ||'--------------------000073 |||||| || code sub |||||| ||? code sub ?????? ||.--------------------000074 |||||| ||| out sub |||||| sub ||'--------------------000074 |||||| || code sp |||||| ||? code sp ?????? || 000075-----------------.|||||| || code ' ' ||||||| ||? code ' ' ??????? ||.--------------------000076 ||||||| ||| out ' ' ||||||| ||'--------------------000076 ||||||| || 000075-----------------'|||||| || code n |||||| ||? code n ?????? ||.--------------------000077 |||||| ||| : : |||||| ||'--------------------000077---------- ----------000077-----------------.|||||| || code 1 ||||||| ||? code 1 ??????? ||.--------------------000078 ||||||| ||| out 1 ||||||| 1 ||'--------------------000078 ||||||| || 000077-----------------'|||||| || code sp |||||| ||? code sp ?????? || 000079-----------------.|||||| || code ' ' ||||||| ||? code ' ' ??????? ||.--------------------000080 ||||||| ||| out ' ' ||||||| ||'--------------------000080 ||||||| || 000079-----------------'|||||| || code f2 |||||| ||? code f2 ?????? ||.--------------------000081 |||||| ||| : : |||||| ||| : : |||||| ||| : : |||||| ||'--------------------000081---------- ----------000081-----------------.|||||| || code '(' ||||||| ||? code '(' ??????? ||.--------------------000082 ||||||| ||| out '(' ||||||| ( ||'--------------------000082 ||||||| || code div ||||||| ||? code div ??????? ||.--------------------000083 ||||||| ||| out div ||||||| div ||'--------------------000083 ||||||| || code sp ||||||| ||? code sp ??????? || 000084----------------.||||||| || code ' ' |||||||| ||? code ' ' ???????? ||.--------------------000085 |||||||| ||| out ' ' |||||||| ||'--------------------000085 |||||||| || 000084----------------'||||||| || code n ||||||| ||? code n ??????? ||.--------------------000086 ||||||| ||| : : ||||||| ||'--------------------000086---------- ----------000086----------------.||||||| || code 1 |||||||| ||? code 1 ???????? ||.--------------------000087 |||||||| ||| out 1 |||||||| 1 ||'--------------------000087 |||||||| || 000086----------------'||||||| || code sp ||||||| ||? code sp ??????? || 000088----------------.||||||| || code ' ' |||||||| ||? code ' ' ???????? ||.--------------------000089 |||||||| ||| out ' ' |||||||| ||'--------------------000089 |||||||| || 000088----------------'||||||| || code x ||||||| ||? code x ??????? ||.--------------------000090 ||||||| ||| : : ||||||| ||'--------------------000090---------- ----------000090----------------.||||||| || code x |||||||| ||? code x ???????? ||.--------------------000091 |||||||| ||| out x |||||||| x ||'--------------------000091 |||||||| || 000090----------------'||||||| || code ')' ||||||| ||? code ')' ??????? ||.--------------------000092 ||||||| ||| out ')' ||||||| ) ||'--------------------000092 ||||||| || 000081-----------------'|||||| || code ')' |||||| ||? code ')' ?????? ||.--------------------000093 |||||| ||| out ')' |||||| ) ||'--------------------000093 |||||| || 000072------------------'||||| || code sp ||||| ||? code sp ????? || 000094------------------.||||| || code ' ' |||||| ||? code ' ' ?????? ||.--------------------000095 |||||| ||| out ' ' |||||| ||'--------------------000095 |||||| || 000094------------------'||||| || code n ||||| ||? code n ????? ||.--------------------000096 ||||| ||| : : ||||| ||'--------------------000096---------- ----------000096------------------.||||| || code 2 |||||| ||? code 2 ?????? ||.--------------------000097 |||||| ||| out 2 |||||| 2 ||'--------------------000097 |||||| || 000096------------------'||||| || code ')' ||||| ||? code ')' ????? ||.--------------------000098 ||||| ||| out ')' ||||| ) ||'--------------------000098 ||||| || 000067-------------------'|||| || code ')' |||| ||? code ')' ???? ||.--------------------000099 |||| ||| out ')' |||| ) ||'--------------------000099 |||| || 000058--------------------'||| || code ')' ||| ||? code ')' ??? ||.--------------------000100 ||| ||| out ')' ||| ) ||'--------------------000100 ||| || 000049---------------------'|| || code nl || ||? code nl ?? || 000101---------------------.|| || code '\n' ||| ||? code '\n' ??? ||.--------------------000102 ||| ||| out '\n' |||
||'--------------------000102 ||| || 000101---------------------'|| || code eoc || ||? code eoc ?? || 000103---------------------.|| || code code ||| |'---------------------000047---------- ----------000047--------------------.||| | output output |||| '----------------------000046 |||| 000047--------------------'||| 000103---------------------'|| 000001----------------------'| 000045-----------------------' eof '\n' ? eof '\n' eof eof [user@machine web]$