start heredoc
This commit is contained in:
		
							parent
							
								
									17f05837ea
								
							
						
					
					
						commit
						25dfb3f277
					
				
							
								
								
									
										79
									
								
								c-like.l
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								c-like.l
									
									
									
									
									
								
							| @ -1,79 +0,0 @@ | ||||
| %{ | ||||
| // Copyright (c) 2015 The golex Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // This is an example program using golex run time library. | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
|   "bufio" | ||||
|   "go/token" | ||||
|   "io" | ||||
|   "unicode" | ||||
| 
 | ||||
|   "github.com/cznic/golex/lex" | ||||
| ) | ||||
| 
 | ||||
| // Allocate Character classes anywhere in [0x80, 0xFF]. | ||||
| const ( | ||||
| 	classUnicodeLeter = iota + 0x80 | ||||
| 	classUnicodeDigit | ||||
| 	classOther | ||||
| ) | ||||
| 
 | ||||
| type lexer struct { | ||||
| 	*lex.Lexer | ||||
| } | ||||
| 
 | ||||
| func rune2Class(r rune) int { | ||||
| 	if r >= 0 && r < 0x80 { // Keep ASCII as it is. | ||||
| 		return int(r) | ||||
| 	} | ||||
| 	if unicode.IsLetter(r) { | ||||
| 		return classUnicodeLeter | ||||
| 	} | ||||
| 	if unicode.IsDigit(r) { | ||||
| 		return classUnicodeDigit | ||||
| 	} | ||||
| 	return classOther | ||||
| } | ||||
| 
 | ||||
| func newLexer(src io.Reader, dst io.Writer, fName string) *lexer { | ||||
|   file := token.NewFileSet().AddFile(fName, -1, 1<<31-1) | ||||
|   lx, err := lex.New(file, bufio.NewReader(src), lex.RuneClass(rune2Class)) | ||||
|   if (err != nil) { panic(err) } | ||||
|   return &lexer{lx} | ||||
| } | ||||
| 
 | ||||
| func (l *lexer) Lex(lval *yySymType) int { | ||||
|   c := l.Enter() | ||||
| 
 | ||||
| %} | ||||
| 
 | ||||
| %yyc c | ||||
| %yyn c = l.Next() | ||||
| %yym l.Mark() | ||||
| 
 | ||||
| digit         [0-9]|{unicodeDigit} | ||||
| identifier    {letter}({letter}|{digit})* | ||||
| int           {digit}+ | ||||
| letter        [_a-zA-Z]|{unicodeLetter} | ||||
| unicodeDigit  \x81 | ||||
| unicodeLetter \x80 | ||||
| op            [-+*/] | ||||
| 
 | ||||
| %% | ||||
| 	c = l.Rule0() | ||||
| 
 | ||||
| [ \t\r\n]+ | ||||
| [/][/][^\n]+  lval.token = string(l.TokenBytes(nil)); return COMMENT | ||||
| func          lval.token = string(l.TokenBytes(nil)); return FUNC | ||||
| {identifier}  lval.token = string(l.TokenBytes(nil)); return IDENT | ||||
| {int}         lval.token = string(l.TokenBytes(nil)); return INT | ||||
| {op}          lval.token = string(l.TokenBytes(nil)); return OP | ||||
| 
 | ||||
| %% | ||||
| 	if c, ok := l.Abort(); ok { return int(c) } | ||||
| 	goto yyAction | ||||
| } | ||||
							
								
								
									
										3330
									
								
								php-parser.go
									
									
									
									
									
								
							
							
						
						
									
										3330
									
								
								php-parser.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								php-parser.l
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								php-parser.l
									
									
									
									
									
								
							| @ -142,6 +142,7 @@ BNUM            0b[01]+ | ||||
| EXPONENT_DNUM   (({LNUM}|{DNUM})[eE][+-]?{LNUM}) | ||||
| VAR_NAME        [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* | ||||
| OPERATORS       [;:,.\[\]()|\/\^&\+-*=%!~$<>?@] | ||||
| NEW_LINE        (\r|\n|\r\n) | ||||
| 
 | ||||
| %% | ||||
|     c = l.Rule0() | ||||
| @ -256,7 +257,7 @@ OPERATORS       [;:,.\[\]()|\/\^&\+-*=%!~$<>?@] | ||||
| <PHP>\*\*                                       fmt.Println("T_POW") | ||||
| <PHP>\<\<                                       fmt.Println("T_SL") | ||||
| <PHP>\>\>                                       fmt.Println("T_SR") | ||||
| <PHP>(#|[/][/])[^\n]+                           fmt.Println("T_COMMENT"); // TODO: handle \r\n and allow ?> | ||||
| <PHP>(#|[/][/]){NEW_LINE}                       fmt.Println("T_COMMENT"); // TODO: handle \r\n and allow ?> | ||||
| <PHP>'[^']*(\\')*'                              fmt.Println("T_CONSTANT_ENCAPSED_STRING") | ||||
| <PHP>{OPERATORS}                                fmt.Printf("%s\n", l.TokenBytes(nil)); | ||||
| 
 | ||||
| @ -270,6 +271,16 @@ OPERATORS       [;:,.\[\]()|\/\^&\+-*=%!~$<>?@] | ||||
| <PROPERTY>.                                     l.ungetN(1);begin(PHP) | ||||
| 
 | ||||
| <PHP>[\']([^\\\']*([\\][\'])*)*[\']             fmt.Printf("T_CONSTANT_ENCAPSED_STRING: %s\n", l.TokenBytes(nil)); | ||||
| 
 | ||||
| <PHP>[b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])){NEW_LINE} | ||||
|     tb := l.TokenBytes(nil) | ||||
|     fmt.Println(string(tb[len(tb)-2])) | ||||
|     // switch la { | ||||
|     //     case '\'' : fmt.Println("ST_NOWDOC");//begin(ST_NOWDOC) | ||||
|     //     case '"' : fmt.Println("ST_HEREDOC");//begin(ST_HEREDOC) | ||||
|     // } | ||||
|     fmt.Printf("T_START_HEREDOC: %s\n", l.TokenBytes(nil)); | ||||
| 
 | ||||
| <PHP>[b]?[\"] | ||||
|     binPrefix := l.TokenBytes(nil)[0] == 'b' | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user