Skip to content

Commit f187f5a

Browse files
committed
feat: build language tree
1 parent 8d85260 commit f187f5a

File tree

6 files changed

+79
-27
lines changed

6 files changed

+79
-27
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ platformVersion = 2025.1.1
1616

1717
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
1818
# Example: platformPlugins = com.jetbrains.php:203.4449.22, org.intellij.scala:2023.3.27@EAP
19-
platformPlugins =com.jetbrains.php:251.23774.318,com.jetbrains.hackathon.indices.viewer:1.30
19+
platformPlugins =com.jetbrains.php:251.23774.318,com.jetbrains.hackathon.indices.viewer:1.30,com.github.xepozz.php_dump:2025.0.5
2020
# Example: platformBundledPlugins = com.intellij.java
2121
platformBundledPlugins =
2222

playground/simple.opcodes.phpo

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
$_main:
3+
; (lines=10, args=0, vars=3, tmps=5)
4+
; (before optimizer)
5+
; /Users/xepozz/IdeaProjects/xepozz/php-opcodes-lang-plugin/playground/simple.php:1-8
6+
0000 EXT_STMT
7+
0001 ASSIGN CV0($var1) int(1)
8+
0002 EXT_STMT
9+
0003 ASSIGN CV1($var2) int(2)
10+
0004 EXT_STMT
11+
0005 T5 = ADD CV0($var1) CV1($var2)
12+
0006 ASSIGN CV2($var3) T5
13+
0007 EXT_STMT
14+
0008 ECHO string("test")
15+
0009 RETURN int(1)

playground/simple.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
$var1 = 1;
4+
$var2 = 2;
5+
6+
$var3 = $var1 + $var2;
7+
8+
echo "test";

src/main/kotlin/com/github/xepozz/php_opcodes_language/language/parser/PHPOp.bnf

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,35 @@
2424
SYMBOL = "SYMBOL"
2525
IDENTIFIER = "IDENTIFIER"
2626
NUMBER = "NUMBER"
27+
DOLLAR_SIGN = "DOLLAR_SIGN"
28+
EQUALS_SIGN = "EQUALS_SIGN"
2729
TEXT = "TEXT"
30+
IDENTIFIER = "IDENTIFIER"
31+
COLON = "COLON"
2832
]
2933
}
3034

3135
// Top level structure
3236
phpOpFile ::= item_*
3337

34-
private item_ ::= internal
38+
private item_ ::= block | COMMENT | EOL
39+
40+
block ::= block_name COLON statements
41+
42+
block_name ::= var_name
43+
44+
statements ::= (statement | COMMENT EOL | EOL)+
45+
46+
statement ::= NUMBER (assignment_instruction | instruction)
47+
48+
assignment_instruction ::= IDENTIFIER EQUALS_SIGN instruction
49+
50+
instruction ::= IDENTIFIER argument? argument?
51+
52+
argument ::= expr
53+
54+
private expr ::= var_name | TEXT | NUMBER | IDENTIFIER paren_expr | IDENTIFIER
55+
56+
paren_expr ::= LPAREN expr RPAREN
3557

36-
internal ::= COMMENT | EOL
58+
private var_name ::= DOLLAR_SIGN IDENTIFIER

src/main/kotlin/com/github/xepozz/php_opcodes_language/language/parser/PHPOp.flex

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@ import java.util.Stack;
2424
// Common macros
2525
WHITESPACE = [ \t\f]
2626
NEWLINE = \r\n|\r|\n
27-
COMMENT = "#"[^\n]*
27+
COMMENT = ";"[^\n]*
2828

2929
// Identifier patterns
30-
IDENTIFIER = [a-zA-Z][a-zA-Z0-9_\-]*
30+
IDENTIFIER = [_a-zA-Z][a-zA-Z0-9_\-]*
3131
NUMBER = [0-9]+
32-
TEXT = [^\s{\}(\)\[\]<\>\|\#\'\`\-\+\?\@][^\s{\}(\)\[\]<\>]*
32+
//TEXT = [^\s{\}(\)\[\]<\>\|\#\'\`\-\+\?\@][^\s{\}(\)\[\]<\>]*
3333
SYMBOL = [\-\+\~\?\<\>\@]
3434

3535
QUOTTED_STRING = "\""(\\\"|[^\"])*"\""
36-
BACKTICK_STRING = "`"(\\\`|[^\`])*"`"
3736

3837
// Special symbols
3938
LBRACE = "{"
@@ -42,6 +41,9 @@ LPAREN = "("
4241
RPAREN = ")"
4342
LBRACKET = "["
4443
RBRACKET = "]"
44+
DOLLAR_SIGN = "$"
45+
EQUALS_SIGN = "="
46+
COLON = ":"
4547

4648
%{
4749
private Stack<Integer> stack = new Stack<>();
@@ -59,26 +61,30 @@ public void yypopState() {
5961
%%
6062

6163
<YYINITIAL, IN_BLOCK> {
62-
{LBRACE} { yypushState(IN_BLOCK); return PHPOpTypes.LBRACE; }
63-
{RBRACE} { yypopState(); return PHPOpTypes.RBRACE; }
64-
65-
// Special symbols
66-
{LPAREN} { return PHPOpTypes.LPAREN; }
67-
{RPAREN} { return PHPOpTypes.RPAREN; }
68-
{LBRACKET} { return PHPOpTypes.LBRACKET; }
69-
{RBRACKET} { return PHPOpTypes.RBRACKET; }
70-
71-
// Common elements
72-
{IDENTIFIER} { return PHPOpTypes.IDENTIFIER; }
73-
{NUMBER} { return PHPOpTypes.NUMBER; }
74-
{SYMBOL} { return PHPOpTypes.SYMBOL; }
75-
{TEXT}|{QUOTTED_STRING}|{BACKTICK_STRING} { return PHPOpTypes.TEXT; }
76-
77-
// Whitespace and comments
78-
{WHITESPACE} { return TokenType.WHITE_SPACE; }
79-
{NEWLINE} { return PHPOpTypes.EOL; }
80-
{COMMENT} { return PHPOpTypes.COMMENT; }
64+
{LBRACE} { yypushState(IN_BLOCK); return PHPOpTypes.LBRACE; }
65+
{RBRACE} { yypopState(); return PHPOpTypes.RBRACE; }
66+
67+
// Special symbols
68+
{LPAREN} { return PHPOpTypes.LPAREN; }
69+
{RPAREN} { return PHPOpTypes.RPAREN; }
70+
{LBRACKET} { return PHPOpTypes.LBRACKET; }
71+
{RBRACKET} { return PHPOpTypes.RBRACKET; }
72+
{DOLLAR_SIGN} { return PHPOpTypes.DOLLAR_SIGN; }
73+
{EQUALS_SIGN} { return PHPOpTypes.EQUALS_SIGN; }
74+
75+
// Common elements
76+
{IDENTIFIER} { return PHPOpTypes.IDENTIFIER; }
77+
{COLON} { return PHPOpTypes.COLON; }
78+
{NUMBER} { return PHPOpTypes.NUMBER; }
79+
{SYMBOL} { return PHPOpTypes.SYMBOL; }
80+
// {TEXT}|{QUOTTED_STRING} { return PHPOpTypes.TEXT; }
81+
{QUOTTED_STRING} { return PHPOpTypes.TEXT; }
82+
83+
// Whitespace and comments
84+
{WHITESPACE} { return TokenType.WHITE_SPACE; }
85+
{NEWLINE} { return PHPOpTypes.EOL; }
86+
{COMMENT} { return PHPOpTypes.COMMENT; }
8187
}
8288

8389
// Catch any other character
84-
[^] { return TokenType.BAD_CHARACTER; }
90+
[^] { return TokenType.BAD_CHARACTER; }

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
name="PHP Opcodes"
1414
implementationClass="com.github.xepozz.php_opcodes_language.language.PHPOpFileType"
1515
language="PHP Opcodes"
16+
extensions="phpo"
1617
/>
1718
<lang.parserDefinition
1819
language="PHP Opcodes"

0 commit comments

Comments
 (0)