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})
|
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
||||||
VAR_NAME [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
|
VAR_NAME [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
|
||||||
OPERATORS [;:,.\[\]()|\/\^&\+-*=%!~$<>?@]
|
OPERATORS [;:,.\[\]()|\/\^&\+-*=%!~$<>?@]
|
||||||
|
NEW_LINE (\r|\n|\r\n)
|
||||||
|
|
||||||
%%
|
%%
|
||||||
c = l.Rule0()
|
c = l.Rule0()
|
||||||
@ -256,7 +257,7 @@ OPERATORS [;:,.\[\]()|\/\^&\+-*=%!~$<>?@]
|
|||||||
<PHP>\*\* fmt.Println("T_POW")
|
<PHP>\*\* fmt.Println("T_POW")
|
||||||
<PHP>\<\< fmt.Println("T_SL")
|
<PHP>\<\< fmt.Println("T_SL")
|
||||||
<PHP>\>\> fmt.Println("T_SR")
|
<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>'[^']*(\\')*' fmt.Println("T_CONSTANT_ENCAPSED_STRING")
|
||||||
<PHP>{OPERATORS} fmt.Printf("%s\n", l.TokenBytes(nil));
|
<PHP>{OPERATORS} fmt.Printf("%s\n", l.TokenBytes(nil));
|
||||||
|
|
||||||
@ -270,6 +271,16 @@ OPERATORS [;:,.\[\]()|\/\^&\+-*=%!~$<>?@]
|
|||||||
<PROPERTY>. l.ungetN(1);begin(PHP)
|
<PROPERTY>. l.ungetN(1);begin(PHP)
|
||||||
|
|
||||||
<PHP>[\']([^\\\']*([\\][\'])*)*[\'] fmt.Printf("T_CONSTANT_ENCAPSED_STRING: %s\n", l.TokenBytes(nil));
|
<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]?[\"]
|
<PHP>[b]?[\"]
|
||||||
binPrefix := l.TokenBytes(nil)[0] == 'b'
|
binPrefix := l.TokenBytes(nil)[0] == 'b'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user