mirror of
https://codeberg.org/icewind/php-literal-parser.git
synced 2026-06-03 10:34:08 +02:00
parent
71427689e7
commit
274af4f920
2 changed files with 18 additions and 24 deletions
|
|
@ -14,6 +14,7 @@ thiserror = "1"
|
||||||
memchr = "2"
|
memchr = "2"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
miette = "3"
|
miette = "3"
|
||||||
|
parse-display = "0.5"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
maplit = "1"
|
maplit = "1"
|
||||||
|
|
|
||||||
41
src/lexer.rs
41
src/lexer.rs
|
|
@ -1,63 +1,56 @@
|
||||||
use logos::{Lexer, Logos, Span};
|
use logos::{Lexer, Logos, Span};
|
||||||
use std::fmt::{Debug, Display, Formatter};
|
use parse_display::Display;
|
||||||
|
use std::fmt::{Debug, Formatter};
|
||||||
|
|
||||||
#[derive(Logos, Debug, PartialEq, Clone, Copy)]
|
#[derive(Logos, Debug, PartialEq, Clone, Copy, Display)]
|
||||||
pub enum Token {
|
pub enum Token {
|
||||||
#[token("array")]
|
#[token("array")]
|
||||||
|
#[display("'array'")]
|
||||||
Array,
|
Array,
|
||||||
#[regex("(?i:true|false)")]
|
#[regex("(?i:true|false)")]
|
||||||
|
#[display("boolean literal")]
|
||||||
Bool,
|
Bool,
|
||||||
#[token("null")]
|
#[token("null")]
|
||||||
|
#[display("'null'")]
|
||||||
Null,
|
Null,
|
||||||
#[token("=>")]
|
#[token("=>")]
|
||||||
|
#[display("'=>'")]
|
||||||
Arrow,
|
Arrow,
|
||||||
#[token("(")]
|
#[token("(")]
|
||||||
|
#[display("'('")]
|
||||||
BracketOpen,
|
BracketOpen,
|
||||||
#[token(")")]
|
#[token(")")]
|
||||||
|
#[display("')'")]
|
||||||
BracketClose,
|
BracketClose,
|
||||||
#[token("[")]
|
#[token("[")]
|
||||||
|
#[display("'['")]
|
||||||
SquareOpen,
|
SquareOpen,
|
||||||
#[token("]")]
|
#[token("]")]
|
||||||
|
#[display("']'")]
|
||||||
SquareClose,
|
SquareClose,
|
||||||
#[token(",")]
|
#[token(",")]
|
||||||
|
#[display("','")]
|
||||||
Comma,
|
Comma,
|
||||||
|
#[display("string literal")]
|
||||||
#[regex("(\"([^\"\\\\]|\\\\.)*\")|(\'([^\'\\\\]|\\\\.)*\')")]
|
#[regex("(\"([^\"\\\\]|\\\\.)*\")|(\'([^\'\\\\]|\\\\.)*\')")]
|
||||||
LiteralString,
|
LiteralString,
|
||||||
|
#[display("float literal")]
|
||||||
#[regex("-?((([0-9]+(_[0-9]+)*|([0-9]*(_[0-9]+)*[\\.][0-9]+(_[0-9]+)*)|([0-9]+(_[0-9]+)*[\\.][0-9]*(_[0-9]+)*)))[eE][+-]?[0-9]+(_[0-9]+)*|([0-9]*(_[0-9]+)*[\\.][0-9]+(_[0-9]+)*)|([0-9]+(_[0-9]+)*[\\.][0-9]*(_[0-9]+)*))")]
|
#[regex("-?((([0-9]+(_[0-9]+)*|([0-9]*(_[0-9]+)*[\\.][0-9]+(_[0-9]+)*)|([0-9]+(_[0-9]+)*[\\.][0-9]*(_[0-9]+)*)))[eE][+-]?[0-9]+(_[0-9]+)*|([0-9]*(_[0-9]+)*[\\.][0-9]+(_[0-9]+)*)|([0-9]+(_[0-9]+)*[\\.][0-9]*(_[0-9]+)*))")]
|
||||||
Float,
|
Float,
|
||||||
|
#[display("integer literal")]
|
||||||
#[regex("-?(0|[1-9][0-9]*(_[0-9]+)*|0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*|0[0-7]+(_[0-7]+)*|0[bB][01]+(_[01]+)*)")]
|
#[regex("-?(0|[1-9][0-9]*(_[0-9]+)*|0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*|0[0-7]+(_[0-7]+)*|0[bB][01]+(_[01]+)*)")]
|
||||||
Integer,
|
Integer,
|
||||||
#[token(";")]
|
#[token(";")]
|
||||||
|
#[display("';'")]
|
||||||
SemiColon,
|
SemiColon,
|
||||||
#[error]
|
#[error]
|
||||||
#[regex(r"(#|//)[^\n]*", logos::skip)]
|
#[regex(r"(#|//)[^\n]*", logos::skip)]
|
||||||
#[regex(r"/\*([^*]|\*[^/])+\*/", logos::skip)]
|
#[regex(r"/\*([^*]|\*[^/])+\*/", logos::skip)]
|
||||||
#[regex(r"[ \t\n\f]+", logos::skip)]
|
#[regex(r"[ \t\n\f]+", logos::skip)]
|
||||||
|
#[display("error")]
|
||||||
Error,
|
Error,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Token {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
||||||
let str = match self {
|
|
||||||
Token::Array => "'array'",
|
|
||||||
Token::Bool => "boolean literal",
|
|
||||||
Token::Null => "'null'",
|
|
||||||
Token::Arrow => "'=>'",
|
|
||||||
Token::BracketOpen => "'('",
|
|
||||||
Token::BracketClose => "')'",
|
|
||||||
Token::SquareOpen => "'['",
|
|
||||||
Token::SquareClose => "']'",
|
|
||||||
Token::Comma => "','",
|
|
||||||
Token::LiteralString => "string literal",
|
|
||||||
Token::Float => "float literal",
|
|
||||||
Token::Integer => "integer literal",
|
|
||||||
Token::SemiColon => "';'",
|
|
||||||
Token::Error => "error",
|
|
||||||
};
|
|
||||||
write!(f, "{}", str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_lex() {
|
fn test_lex() {
|
||||||
let source = r###"
|
let source = r###"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue