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]$






