raku.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. // raku
  2. /* Raku is an easy to use scripting language that can also be used easily interactively
  3. Desrired syntax (verified LL(1) on smlweb.cpsc.ucalgary.ca)
  4. PROGRAM -> STATEMENTS.
  5. STATEMENTS -> STATEMENT STATEMENTS | .
  6. STATEMENT -> EXPRESSION EOX | DEFINITION | BLOCK | EOX .
  7. DEFINITION -> define WORDS BLOCK.
  8. WORDS -> word WORDS | .
  9. EXPRESSION -> WORDVALUE MODIFIERS.
  10. MODIFIERS -> MODIFIER MODIFIERS | .
  11. OPERATION -> operator MODIFIER .
  12. MODIFIER -> OPERATION | WORDVALUE | PARENTHESIS | BLOCK.
  13. PARENTHESIS -> '(' EXPRESSION ')' | ot EXPRESSION ct.
  14. BLOCK -> oe STATEMENTS ce | do STATEMENTS end .
  15. WORDVALUE -> word | VALUE | a | the.
  16. VALUE -> string | number | symbol.
  17. EOX -> eol | period.
  18. Lexer:
  19. */
  20. package raku
  21. import (
  22. "bytes"
  23. "fmt"
  24. "io"
  25. "reflect"
  26. "runtime"
  27. "strings"
  28. "unicode"
  29. "github.com/beoran/woe/graphviz"
  30. "github.com/beoran/woe/monolog"
  31. "github.com/beoran/woe/tree"
  32. )
  33. type Value string
  34. type TokenType int64
  35. type Position struct {
  36. Index int
  37. Row int
  38. Column int
  39. }
  40. const (
  41. TokenPeriod TokenType = TokenType('.')
  42. TokenComma TokenType = TokenType(',')
  43. TokenSemicolon TokenType = TokenType(';')
  44. TokenColon TokenType = TokenType(':')
  45. TokenOpenParen TokenType = TokenType('(')
  46. TokenCloseParen TokenType = TokenType(')')
  47. TokenOpenBrace TokenType = TokenType('{')
  48. TokenCloseBrace TokenType = TokenType('}')
  49. TokenOpenBracket TokenType = TokenType('[')
  50. TokenCloseBracket TokenType = TokenType(']')
  51. TokenNone TokenType = 0
  52. TokenError TokenType = -1
  53. TokenWord TokenType = -2
  54. TokenEOL TokenType = -3
  55. TokenEOF TokenType = -4
  56. TokenNumber TokenType = -5
  57. TokenOperator TokenType = -6
  58. TokenString TokenType = -7
  59. TokenSymbol TokenType = -8
  60. TokenFirstKeyword TokenType = -9
  61. TokenKeywordA TokenType = -10
  62. TokenKeywordDo TokenType = -11
  63. TokenKeywordEnd TokenType = -12
  64. TokenKeywordThe TokenType = -13
  65. TokenKeywordDef TokenType = -14
  66. TokenLastKeyword TokenType = -15
  67. TokenLast TokenType = -15
  68. )
  69. type Token struct {
  70. TokenType
  71. Value
  72. Position
  73. }
  74. var tokenTypeMap map[TokenType]string = map[TokenType]string{
  75. TokenNone: "TokenNone",
  76. TokenError: "TokenError",
  77. TokenWord: "TokenWord",
  78. TokenEOL: "TokenEOL",
  79. TokenEOF: "TokenEOF",
  80. TokenNumber: "TokenNumber",
  81. TokenOperator: "TokenOperator",
  82. TokenString: "TokenString",
  83. TokenSymbol: "TokenSymbol",
  84. TokenKeywordA: "TokenKeywordA",
  85. TokenKeywordDo: "TokenKeywordDo",
  86. TokenKeywordEnd: "TokenKeywordEnd",
  87. TokenKeywordThe: "TokenKeywordThe",
  88. TokenKeywordDef: "TokenKeywordDef",
  89. }
  90. var keywordMap map[string]TokenType = map[string]TokenType{
  91. "a": TokenKeywordA,
  92. "an": TokenKeywordA,
  93. "do": TokenKeywordDo,
  94. "def": TokenKeywordDef,
  95. "define": TokenKeywordDef,
  96. "end": TokenKeywordEnd,
  97. "the": TokenKeywordThe,
  98. }
  99. var sigilMap map[string]TokenType = map[string]TokenType{
  100. "[": TokenOpenBracket,
  101. "{": TokenOpenBrace,
  102. "(": TokenOpenParen,
  103. "]": TokenCloseBracket,
  104. "}": TokenCloseBrace,
  105. ")": TokenCloseParen,
  106. }
  107. func (me TokenType) String() string {
  108. name, found := tokenTypeMap[me]
  109. if found {
  110. return name
  111. } else {
  112. if (me > 0) && (me < 256) {
  113. return fmt.Sprintf("TokenChar<%c>", byte(me))
  114. }
  115. return fmt.Sprintf("Unknown Token %d", int(me))
  116. }
  117. }
  118. func (me Token) String() string {
  119. return fmt.Sprintf("Token: %s >%s< %d %d %d.", me.TokenType, string(me.Value), me.Index, me.Row, me.Column)
  120. }
  121. type TokenChannel chan *Token
  122. type Lexer struct {
  123. Reader io.Reader
  124. Current Position
  125. Last Position
  126. Token Token
  127. rule LexerRule
  128. Output TokenChannel
  129. buffer []byte
  130. runes []rune
  131. }
  132. type LexerRule func(lexer *Lexer) LexerRule
  133. func (me *Lexer) Emit(t TokenType, v Value) {
  134. tok := &Token{t, v, me.Current}
  135. me.Output <- tok
  136. }
  137. func (me *Lexer) Error(message string, args ...interface{}) {
  138. value := fmt.Sprintf(message, args...)
  139. monolog.Error("Lex Error: %s", value)
  140. me.Emit(TokenError, Value(value))
  141. }
  142. func LexError(me *Lexer) LexerRule {
  143. me.Error("Error")
  144. return nil
  145. }
  146. func (me *Lexer) SkipComment() bool {
  147. if me.Peek() == '#' {
  148. if me.Next() == '(' {
  149. return me.SkipNotIn(")")
  150. } else {
  151. return me.SkipNotIn("\r\n")
  152. }
  153. }
  154. return true
  155. }
  156. /* Returns whether or not a keyword was found, and if so, the TokenType
  157. of the keyword.*/
  158. func LookupKeyword(word string) (bool, TokenType) {
  159. kind, found := keywordMap[word]
  160. return found, kind
  161. }
  162. /* Returns whether or not a special operator or sigil was found, and if so,
  163. returns the TokenTyp of the sigil.*/
  164. func LookupSigil(sigil string) (bool, TokenType) {
  165. fmt.Printf("LookupSigil: %s\n", sigil)
  166. kind, found := sigilMap[sigil]
  167. return found, kind
  168. }
  169. func LexSigil(me *Lexer) LexerRule {
  170. me.Found(TokenType(me.Peek()))
  171. _ = me.Next()
  172. me.Advance()
  173. return LexNormal
  174. }
  175. func LexWord(me *Lexer) LexerRule {
  176. me.SkipNotIn(" \t\r\n'({[]})")
  177. iskw, kind := LookupKeyword(me.CurrentStringValue())
  178. if iskw {
  179. me.Found(kind)
  180. } else {
  181. me.Found(TokenWord)
  182. }
  183. return LexNormal
  184. }
  185. func LexSymbol(me *Lexer) LexerRule {
  186. me.SkipNotIn(" \t\r\n'({[]})")
  187. me.Found(TokenSymbol)
  188. return LexNormal
  189. }
  190. func LexNumber(me *Lexer) LexerRule {
  191. me.SkipNotIn(" \t\r\n'({[]})")
  192. me.Found(TokenNumber)
  193. return LexNormal
  194. }
  195. func LexWhitespace(me *Lexer) LexerRule {
  196. me.SkipWhitespace()
  197. me.Advance()
  198. return LexNormal
  199. }
  200. func LexComment(me *Lexer) LexerRule {
  201. if !me.SkipComment() {
  202. me.Error("Unterminated comment")
  203. return LexError
  204. }
  205. me.Advance()
  206. return LexNormal
  207. }
  208. func LexPunctuator(me *Lexer) LexerRule {
  209. me.Found(TokenType(me.Next()))
  210. me.Advance()
  211. return LexNormal
  212. }
  213. func LexEOL(me *Lexer) LexerRule {
  214. me.SkipIn("\r\n")
  215. me.Found(TokenEOL)
  216. return LexNormal
  217. }
  218. func LexOperator(me *Lexer) LexerRule {
  219. me.SkipNotIn(" \t\r\n({[]})")
  220. issig, kind := LookupSigil(me.CurrentStringValue())
  221. if issig {
  222. me.Found(kind)
  223. } else {
  224. me.Found(TokenOperator)
  225. }
  226. return LexNormal
  227. }
  228. func lexEscape(me *Lexer) error {
  229. _ = me.Next()
  230. return nil
  231. }
  232. func LexString(me *Lexer) LexerRule {
  233. open := me.Peek()
  234. do_escape := open == '"'
  235. peek := me.Next()
  236. me.Advance()
  237. for ; peek != '\000'; peek = me.Next() {
  238. if do_escape && peek == '\\' {
  239. if err := lexEscape(me); err != nil {
  240. return LexError
  241. }
  242. } else if peek == open {
  243. me.Found(TokenString)
  244. _ = me.Next()
  245. me.Advance()
  246. return LexNormal
  247. }
  248. }
  249. me.Error("Unexpected EOF in string.")
  250. return nil
  251. }
  252. func LexNumberOrOperator(me *Lexer) LexerRule {
  253. if unicode.IsDigit(me.Next()) {
  254. return LexNumber
  255. } else {
  256. _ = me.Previous()
  257. return LexOperator
  258. }
  259. }
  260. func LexNormal(me *Lexer) LexerRule {
  261. peek := me.Peek()
  262. if peek == '#' {
  263. return LexComment
  264. } else if strings.ContainsRune(" \t", peek) {
  265. return LexWhitespace
  266. } else if strings.ContainsRune(".,;:", peek) {
  267. return LexPunctuator
  268. } else if strings.ContainsRune("([{}])", peek) {
  269. return LexSigil
  270. } else if strings.ContainsRune("$", peek) {
  271. return LexSymbol
  272. } else if strings.ContainsRune("\r\n", peek) {
  273. return LexEOL
  274. } else if strings.ContainsRune("+-", peek) {
  275. return LexNumberOrOperator
  276. } else if strings.ContainsRune("\"`", peek) {
  277. return LexString
  278. } else if peek == '\000' {
  279. me.Emit(TokenEOF, "")
  280. return nil
  281. } else if unicode.IsLetter(peek) {
  282. return LexWord
  283. } else if unicode.IsDigit(peek) {
  284. return LexNumber
  285. } else {
  286. return LexOperator
  287. }
  288. }
  289. func OpenLexer(reader io.Reader) *Lexer {
  290. lexer := &Lexer{}
  291. lexer.Reader = reader
  292. lexer.Output = make(TokenChannel)
  293. // lexer.buffer = new(byte[1024])
  294. return lexer
  295. }
  296. func (me *Lexer) ReadReaderOnce() (bool, error) {
  297. buffer := make([]byte, 1024)
  298. n, err := me.Reader.Read(buffer)
  299. monolog.Debug("read %v %d %v\n", buffer[:n], n, err)
  300. if n > 0 {
  301. me.buffer = append(me.buffer, buffer[:n]...)
  302. monolog.Debug("append %s", me.buffer)
  303. }
  304. if err == io.EOF {
  305. return true, nil
  306. } else if err != nil {
  307. me.Error("Error reading from reader: %s", err)
  308. return true, err
  309. }
  310. return false, nil
  311. }
  312. func (me *Lexer) ReadReader() error {
  313. me.buffer = make([]byte, 0)
  314. more, err := me.ReadReaderOnce()
  315. for err == nil && more {
  316. more, err = me.ReadReaderOnce()
  317. }
  318. me.runes = bytes.Runes(me.buffer)
  319. return err
  320. }
  321. func (me *Lexer) Peek() rune {
  322. if (me.Current.Index) >= len(me.runes) {
  323. return '\000'
  324. }
  325. return me.runes[me.Current.Index]
  326. }
  327. func (me *Lexer) PeekNext() rune {
  328. if (me.Current.Index + 1) >= len(me.runes) {
  329. return '\000'
  330. }
  331. return me.runes[me.Current.Index+1]
  332. }
  333. func (me *Lexer) Next() rune {
  334. if me.Peek() == '\n' {
  335. me.Current.Column = 0
  336. me.Current.Row++
  337. }
  338. me.Current.Index++
  339. if me.Current.Index >= len(me.runes) {
  340. //me.Emit(TokenEOF, "")
  341. }
  342. return me.Peek()
  343. }
  344. func (me *Lexer) Previous() rune {
  345. if me.Current.Index > 0 {
  346. me.Current.Index--
  347. if me.Peek() == '\n' {
  348. me.Current.Column = 0
  349. me.Current.Row++
  350. }
  351. }
  352. return me.Peek()
  353. }
  354. func (me *Lexer) SkipRune() {
  355. _ = me.Next()
  356. }
  357. func (me *Lexer) SkipIn(set string) bool {
  358. for strings.ContainsRune(set, me.Next()) {
  359. monolog.Debug("SkipIn: %s %c\n", set, me.Peek())
  360. if me.Peek() == '\000' {
  361. return false
  362. }
  363. }
  364. return true
  365. }
  366. func (me *Lexer) SkipNotIn(set string) bool {
  367. _ = me.Next()
  368. for !strings.ContainsRune(set, me.Peek()) {
  369. if me.Next() == '\000' {
  370. return false
  371. }
  372. }
  373. return true
  374. }
  375. func (me *Lexer) SkipWhile(should_skip func(r rune) bool) bool {
  376. for should_skip(me.Peek()) {
  377. if me.Next() == '\000' {
  378. return false
  379. }
  380. }
  381. return true
  382. }
  383. func (me *Lexer) SkipWhitespace() {
  384. me.SkipIn(" \t")
  385. }
  386. func (me *Lexer) Advance() {
  387. me.Last = me.Current
  388. }
  389. func (me *Lexer) Rewind() {
  390. me.Current = me.Last
  391. }
  392. func (me *Lexer) CurrentRuneValue() []rune {
  393. return me.runes[me.Last.Index:me.Current.Index]
  394. }
  395. func (me *Lexer) CurrentStringValue() string {
  396. return string(me.CurrentRuneValue())
  397. }
  398. func (me *Lexer) Found(kind TokenType) {
  399. me.Emit(kind, Value(me.CurrentStringValue()))
  400. me.Advance()
  401. }
  402. func GetFunctionName(fun interface{}) string {
  403. return runtime.FuncForPC(reflect.ValueOf(fun).Pointer()).Name()
  404. }
  405. func (me *Lexer) Start() {
  406. if err := me.ReadReader(); err == nil || err == io.EOF {
  407. rule := LexNormal
  408. for rule != nil {
  409. monolog.Debug("Lexer Rule: %s\n", GetFunctionName(rule))
  410. rule = rule(me)
  411. }
  412. } else {
  413. me.Error("Could not read in input buffer: %s", err)
  414. }
  415. close(me.Output)
  416. }
  417. func (me *Lexer) TryLexing() {
  418. go me.Start()
  419. for token := range me.Output {
  420. monolog.Info("Token %s", token)
  421. }
  422. }
  423. type AstType int
  424. const (
  425. AstTypeProgram = AstType(iota)
  426. AstTypeStatements
  427. AstTypeStatement
  428. AstTypeDefinition
  429. AstTypeWords
  430. AstTypeExpression
  431. AstTypeWordExpression
  432. AstTypeWordCallop
  433. AstTypeOperation
  434. AstTypeOperations
  435. AstTypeCallArgs
  436. AstTypeValueExpression
  437. AstTypeValueCallop
  438. AstTypeParametersNonempty
  439. AstTypeParameters
  440. AstTypeParameter
  441. AstTypeBlock
  442. AstTypeWordValue
  443. AstTypeWord
  444. AstTypeValue
  445. AstTypeEox
  446. AstTypeOperator
  447. AstTypeParenthesis
  448. AstTypeModifier
  449. AstTypeError
  450. )
  451. var astTypeMap map[AstType]string = map[AstType]string{
  452. AstTypeProgram: "AstTypeProgram",
  453. AstTypeStatements: "AstTypeStatements",
  454. AstTypeStatement: "AstTypeStatement:",
  455. AstTypeDefinition: "AstTypeDefinition",
  456. AstTypeWords: "AstTypeWords",
  457. AstTypeExpression: "AstTypeExpression",
  458. AstTypeWordExpression: "AstTypeWordExpression",
  459. AstTypeWordCallop: "AstTypeWordCallop",
  460. AstTypeOperation: "AstTypeOperation",
  461. AstTypeOperations: "AstTypeOperations",
  462. AstTypeCallArgs: "AstTypeCallArgs",
  463. AstTypeValueExpression: "AstTypeValueExpression",
  464. AstTypeValueCallop: "AstTypeValueCallop",
  465. AstTypeParametersNonempty: "AstTypeParametersNonempty",
  466. AstTypeParameters: "AstTypeParameters",
  467. AstTypeParameter: "AstTypeParameter",
  468. AstTypeBlock: "AstTypeBlock",
  469. AstTypeWordValue: "AstTypeWordValue",
  470. AstTypeWord: "AstTypeWord",
  471. AstTypeValue: "AstTypeValue",
  472. AstTypeEox: "AstTypeEox",
  473. AstTypeOperator: "AstTypeOperator",
  474. AstTypeParenthesis: "AstTypeParenthesis",
  475. AstTypeModifier: "AstTypeModifier",
  476. AstTypeError: "AstTypeError",
  477. }
  478. func (me AstType) String() string {
  479. name, found := astTypeMap[me]
  480. if found {
  481. return name
  482. } else {
  483. return fmt.Sprintf("Unknown AstType %d", int(me))
  484. }
  485. }
  486. type Ast struct {
  487. tree.Node
  488. AstType
  489. *Token
  490. }
  491. func (me *Ast) NewChild(kind AstType, token *Token) *Ast {
  492. child := &Ast{}
  493. child.AstType = kind
  494. child.Token = token
  495. tree.AppendChild(me, child)
  496. return child
  497. }
  498. func (me *Ast) Walk(walker func(ast *Ast) *Ast) *Ast {
  499. node_res := tree.Walk(me,
  500. func(node tree.Noder) tree.Noder {
  501. ast_res := walker(node.(*Ast))
  502. if ast_res == nil {
  503. return nil
  504. } else {
  505. return ast_res
  506. }
  507. })
  508. if node_res != nil {
  509. return node_res.(*Ast)
  510. } else {
  511. return nil
  512. }
  513. }
  514. func (me *Ast) Remove() {
  515. _ = tree.Remove(me)
  516. }
  517. func NewAst(kind AstType) *Ast {
  518. ast := &Ast{}
  519. ast.AstType = kind
  520. ast.Token = nil
  521. return ast
  522. }
  523. type ParseAction func(parser *Parser) bool
  524. type RuleType int
  525. const (
  526. RuleTypeNone = RuleType(iota)
  527. RuleTypeAlternate
  528. RuleTypeSequence
  529. )
  530. type Rule struct {
  531. tree.Node
  532. Name string
  533. RuleType
  534. ParseAction
  535. }
  536. func NewRule(name string, ruty RuleType) *Rule {
  537. res := &Rule{}
  538. res.RuleType = ruty
  539. res.Name = name
  540. return res
  541. }
  542. func (me *Rule) NewChild(action ParseAction) *Rule {
  543. child := NewRule("foo", RuleTypeNone)
  544. tree.AppendChild(me, child)
  545. return child
  546. }
  547. func (me *Rule) Walk(walker func(rule *Rule) *Rule) *Rule {
  548. node_res := tree.Walk(me,
  549. func(node tree.Noder) tree.Noder {
  550. rule_res := walker(node.(*Rule))
  551. if rule_res == nil {
  552. return nil
  553. } else {
  554. return rule_res
  555. }
  556. })
  557. return node_res.(*Rule)
  558. }
  559. type Parser struct {
  560. *Ast
  561. *Lexer
  562. now *Ast
  563. lookahead *Token
  564. }
  565. func (me *Parser) SetupRules() {
  566. }
  567. func (me *Parser) Expect(types ...TokenType) bool {
  568. monolog.Debug("Expecting: ", types, " from ", me.now.AstType, " have ", me.LookaheadType(), " \n")
  569. for _, t := range types {
  570. if me.LookaheadType() == t {
  571. monolog.Debug("Found: ", t, "\n")
  572. return true
  573. }
  574. }
  575. monolog.Debug("Not found.\n")
  576. return false
  577. }
  578. type Parsable interface {
  579. isParsable()
  580. }
  581. func (me TokenType) isParsable() {
  582. }
  583. func (me ParseAction) isParsable() {
  584. }
  585. /* Advance the lexer but only of there is no lookahead token already available in me.lookahead.
  586. */
  587. func (me *Parser) Advance() *Token {
  588. if me.lookahead == nil {
  589. me.lookahead = <-me.Lexer.Output
  590. }
  591. return me.lookahead
  592. }
  593. func (me *Parser) DropLookahead() {
  594. me.lookahead = nil
  595. }
  596. func (me *Parser) Lookahead() *Token {
  597. return me.lookahead
  598. }
  599. func (me *Parser) LookaheadType() TokenType {
  600. if me.lookahead == nil {
  601. return TokenError
  602. }
  603. return me.Lookahead().TokenType
  604. }
  605. func (me *Parser) Consume(atyp AstType, types ...TokenType) bool {
  606. me.Advance()
  607. res := me.Expect(types...)
  608. if res {
  609. me.NewAstChild(atyp)
  610. me.DropLookahead()
  611. }
  612. return res
  613. }
  614. func (me *Parser) ConsumeWithoutAst(types ...TokenType) bool {
  615. me.Advance()
  616. res := me.Expect(types...)
  617. if res {
  618. me.DropLookahead()
  619. }
  620. return res
  621. }
  622. /*
  623. func (me * Parser) OneOf(restype AstType, options ...Parsable) bool {
  624. res := false
  625. k, v := range options {
  626. switch option := v.Type {
  627. case TokenType: res := Consume(restype, option)
  628. case ParseAction: res := option(me)
  629. }
  630. }
  631. return res
  632. }
  633. */
  634. func (me *Parser) ParseEOX() bool {
  635. return me.ConsumeWithoutAst(TokenEOL, TokenPeriod)
  636. }
  637. func (me *Parser) ParseValue() bool {
  638. return me.Consume(AstTypeValue, TokenString, TokenNumber, TokenSymbol)
  639. }
  640. func (me *Parser) ParseWord() bool {
  641. return me.Consume(AstTypeWord, TokenWord, TokenKeywordA, TokenKeywordThe)
  642. }
  643. func (me *Parser) ParseWordValue() bool {
  644. me.NewAstChildDescend(AstTypeWordValue)
  645. res := me.ParseValue() || me.ParseWord()
  646. me.AstAscend(res)
  647. return res
  648. }
  649. func (me *Parser) ParseParameter() bool {
  650. me.NewAstChildDescend(AstTypeParameter)
  651. res := me.ParseWordValue() || me.ParseBlock()
  652. me.AstAscend(res)
  653. return res
  654. }
  655. func (me *Parser) ParseParametersNonempty() bool {
  656. res := false
  657. for me.ParseParameter() {
  658. res = true
  659. }
  660. return res
  661. }
  662. func (me *Parser) ParseParameters() bool {
  663. me.NewAstChildDescend(AstTypeParameters)
  664. _ = me.ParseParametersNonempty()
  665. me.AstAscend(true)
  666. return true
  667. }
  668. func (me *Parser) ParseCallArgs() bool {
  669. me.NewAstChildDescend(AstTypeCallArgs)
  670. res := me.ParseParameters() && me.ParseEOX()
  671. me.AstAscend(res)
  672. return res
  673. }
  674. func (me *Parser) ParseOperator() bool {
  675. return me.Consume(AstTypeOperator, TokenOperator)
  676. }
  677. /*
  678. func (me *Parser) ParseOperation() bool {
  679. me.NewAstChildDescend(AstTypeOperation)
  680. res := me.ParseOperator() && me.ParseParameter()
  681. me.AstAscend(res)
  682. return res
  683. }
  684. */
  685. func (me *Parser) ParseOperations() bool {
  686. me.NewAstChildDescend(AstTypeOperations)
  687. res := me.ParseOperation()
  688. for me.ParseOperation() {
  689. }
  690. me.AstAscend(res)
  691. return res
  692. }
  693. func (me *Parser) ParseWordCallOp() bool {
  694. me.NewAstChildDescend(AstTypeWordCallop)
  695. res := me.ParseCallArgs() || me.ParseOperations()
  696. me.AstAscend(res)
  697. return res
  698. }
  699. func (me *Parser) ParseWordExpression() bool {
  700. me.NewAstChildDescend(AstTypeWordExpression)
  701. res := me.ParseWord() && me.ParseWordCallOp()
  702. me.AstAscend(res)
  703. return res
  704. }
  705. func (me *Parser) ParseValueCallOp() bool {
  706. me.NewAstChildDescend(AstTypeValueCallop)
  707. res := me.ParseCallArgs() || me.ParseOperations()
  708. me.AstAscend(res)
  709. return res
  710. }
  711. func (me *Parser) ParseValueExpression() bool {
  712. me.NewAstChildDescend(AstTypeValueExpression)
  713. res := me.ParseValue() && me.ParseValueCallOp()
  714. me.AstAscend(res)
  715. return false
  716. }
  717. func (me *Parser) NewAstChild(tyty AstType) *Ast {
  718. return me.now.NewChild(tyty, me.lookahead)
  719. }
  720. func (me *Parser) NewAstChildDescend(tyty AstType) {
  721. node := me.NewAstChild(tyty)
  722. me.now = node
  723. }
  724. func (me *Parser) AstAscend(keep bool) {
  725. if me.now.Parent() != nil {
  726. now := me.now
  727. me.now = now.Parent().(*Ast)
  728. if !keep {
  729. now.Remove()
  730. }
  731. }
  732. }
  733. func (me TokenType) BlockCloseForOpen() (TokenType, bool) {
  734. switch me {
  735. case TokenOpenBrace:
  736. return TokenCloseBrace, true
  737. case TokenOpenParen:
  738. return TokenCloseParen, true
  739. default:
  740. return TokenError, false
  741. }
  742. }
  743. func (me TokenType) ParenthesisCloseForOpen() (TokenType, bool) {
  744. switch me {
  745. case TokenOpenBracket:
  746. return TokenCloseBracket, true
  747. case TokenOpenParen:
  748. return TokenCloseParen, true
  749. default:
  750. return TokenError, false
  751. }
  752. }
  753. func (me *Parser) ParseBlock() bool {
  754. me.Advance()
  755. open := me.LookaheadType()
  756. done, ok := open.BlockCloseForOpen()
  757. if !ok {
  758. /* Not an opening of a block, so no block found. */
  759. return false
  760. }
  761. me.DropLookahead()
  762. me.NewAstChildDescend(AstTypeBlock)
  763. res := me.ParseStatements()
  764. me.AstAscend(res)
  765. if res {
  766. me.Advance()
  767. if me.LookaheadType() != done {
  768. return me.ParseError()
  769. }
  770. me.DropLookahead()
  771. }
  772. return res
  773. }
  774. func (me *Parser) ParseParenthesis() bool {
  775. me.Advance()
  776. open := me.LookaheadType()
  777. done, ok := open.ParenthesisCloseForOpen()
  778. if !ok {
  779. /* Not an opening of a parenthesis, so no parenthesis found. */
  780. return false
  781. }
  782. me.DropLookahead()
  783. me.NewAstChildDescend(AstTypeParenthesis)
  784. res := me.ParseExpression()
  785. me.AstAscend(res)
  786. if res {
  787. me.Advance()
  788. if me.LookaheadType() != done {
  789. return me.ParseError()
  790. }
  791. me.DropLookahead()
  792. }
  793. return res
  794. }
  795. func (me *Parser) ParseWords() bool {
  796. me.NewAstChildDescend(AstTypeWords)
  797. res := me.ParseWord()
  798. for me.ParseWord() {
  799. }
  800. me.AstAscend(res)
  801. return res
  802. }
  803. func (me *Parser) ParseDefinition() bool {
  804. me.Advance()
  805. res := me.Consume(AstTypeDefinition, TokenKeywordDef)
  806. if !res {
  807. return false
  808. }
  809. res = res && me.ParseWords()
  810. if !res {
  811. _ = me.ParseError()
  812. }
  813. res = res && me.ParseBlock()
  814. if !res {
  815. _ = me.ParseError()
  816. }
  817. me.AstAscend(true)
  818. return res
  819. }
  820. func (me *Parser) ParseOperation() bool {
  821. me.NewAstChildDescend(AstTypeOperation)
  822. res := me.ParseOperator() && me.ParseModifier()
  823. me.AstAscend(res)
  824. return res
  825. }
  826. func (me *Parser) ParseModifier() bool {
  827. me.NewAstChildDescend(AstTypeModifier)
  828. res := me.ParseOperation() || me.ParseWordValue() ||
  829. me.ParseParenthesis() || me.ParseBlock()
  830. me.AstAscend(res)
  831. return res
  832. }
  833. func (me *Parser) ParseModifiers() bool {
  834. for me.ParseModifier() {
  835. }
  836. return true
  837. }
  838. func (me *Parser) ParseError() bool {
  839. me.now.NewChild(AstTypeError, me.lookahead)
  840. fmt.Printf("Parse error: at %s\n", me.lookahead)
  841. return false
  842. }
  843. func (me *Parser) ParseExpression() bool {
  844. return me.ParseWordValue() && me.ParseModifiers()
  845. }
  846. func (me *Parser) ParseStatement() bool {
  847. me.NewAstChildDescend(AstTypeStatement)
  848. /* First case is for an empty expression/statement. */
  849. res := me.ParseEOX() ||
  850. me.ParseDefinition() ||
  851. (me.ParseExpression() && me.ParseEOX()) ||
  852. me.ParseBlock()
  853. me.AstAscend(res)
  854. return res
  855. }
  856. func (me *Parser) ParseEOF() bool {
  857. return me.Consume(AstTypeEox, TokenEOF)
  858. }
  859. func (me *Parser) ParseStatements() bool {
  860. me.NewAstChildDescend(AstTypeStatements)
  861. res := me.ParseStatement()
  862. for me.ParseStatement() {
  863. }
  864. me.AstAscend(res)
  865. return res
  866. }
  867. func (me *Parser) ParseProgram() bool {
  868. return me.ParseStatements() && me.ParseEOF()
  869. }
  870. func NewParserForLexer(lexer *Lexer) *Parser {
  871. me := &Parser{}
  872. me.Ast = NewAst(AstTypeProgram)
  873. me.now = me.Ast
  874. me.Lexer = lexer
  875. me.Ast.Token = &Token{}
  876. go me.Lexer.Start()
  877. return me
  878. }
  879. func NewParserForText(text string) *Parser {
  880. lexer := OpenLexer(strings.NewReader(text))
  881. return NewParserForLexer(lexer)
  882. }
  883. func (me *Ast) DotID() string {
  884. return fmt.Sprintf("ast_%p", me)
  885. }
  886. func (me *Ast) Dotty() {
  887. g := graphviz.NewDigraph("rankdir", "LR")
  888. me.Walk(func(ast *Ast) *Ast {
  889. label := ast.AstType.String()
  890. if ast.Token != nil {
  891. label = label + "\n" + ast.Token.String()
  892. }
  893. g.AddNode(ast.DotID(), "label", label)
  894. if ast.Parent() != nil {
  895. g.AddEdgeByName(ast.Parent().(*Ast).DotID(), ast.DotID())
  896. }
  897. return nil
  898. })
  899. g.Dotty()
  900. }
  901. /*
  902. PROGRAM -> STATEMENTS.
  903. STATEMENTS -> STATEMENT STATEMENTS | .
  904. STATEMENT -> EXPRESSION EOX | DEFINITION | BLOCK | EOX .
  905. DEFINITION -> define WORDS BLOCK.
  906. WORDS -> word WORDS | .
  907. EXPRESSION -> WORDVALUE MODIFIERS.
  908. MODIFIERS -> MODIFIER MODIFIERS | .
  909. OPERATION -> operator MODIFIER .
  910. MODIFIER -> OPERATION | WORDVALUE | PARENTHESIS | BLOCK.
  911. PARENTHESIS -> '(' EXPRESSION ')' | ot EXPRESSION ct.
  912. BLOCK -> oe STATEMENTS ce | do STATEMENTS end .
  913. WORDVALUE -> word | VALUE | a | the.
  914. VALUE -> string | number | symbol.
  915. EOX -> eol | period.
  916. AstNodeBlock = AstNodeType(iota)
  917. )
  918. */
  919. type DefineType int
  920. const (
  921. DefineTypeNone = DefineType(iota),
  922. DefineTypeGo,
  923. DefineTypeUser,
  924. DefineTypeVar,
  925. )
  926. type Value interface {
  927. }
  928. type DefinePattern struct {
  929. Parts []string
  930. }
  931. type GoDefineFunc func(runtime Runtime, args ... Value) Value;
  932. type UserDefine struct {
  933. DefinePattern
  934. * Ast
  935. }
  936. type GoDefine struct {
  937. DefinePattern
  938. * GoDefineFunc
  939. }
  940. type Define struct {
  941. DefineType
  942. Ast * definition
  943. }
  944. type Environment struct {
  945. Parent *Environment
  946. }
  947. type Runtime struct {
  948. Environment
  949. }
  950. func main() {
  951. fmt.Println("Hello World!")
  952. }