Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
4.8 kB · 205 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206<?php
/** * Generates non-sense code snippets according to context-free rules, respecting * indentation etc. * * Also provides a common ruleset shared among many mainstream programming * languages (that is, not Lisp). */abstract class PhutilCodeSnippetContextFreeGrammar extends PhutilContextFreeGrammar {
public function generate() { // A trailing newline is favorable for source code return trim(parent::generate())."\n"; }
final protected function getRules() { return array_merge( $this->getStartGrammarSet(), $this->getStmtGrammarSet(), array_mergev($this->buildRuleSet())); }
abstract protected function buildRuleSet();
protected function buildGrammarSet($name, array $set) { return array( $name => $set, ); }
protected function getStartGrammarSet() { return $this->buildGrammarSet('start', array( "[stmt]\n[stmt]", "[stmt]\n[stmt]\n[stmt]", "[stmt]\n[stmt]\n[stmt]\n[stmt]", )); }
protected function getStmtGrammarSet() { return $this->buildGrammarSet('stmt', array( '[assignment][term]', '[assignment][term]', '[assignment][term]', '[assignment][term]', '[funccall][term]', '[funccall][term]', '[funccall][term]', '[funccall][term]', '[cond]', '[loop]', )); }
protected function getFuncNameGrammarSet() { return $this->buildGrammarSet('funcname', array( 'do_something', 'nonempty', 'noOp', 'call_user_func', 'getenv', 'render', 'super', 'derpify', 'awesomize', 'equals', 'run', 'flee', 'fight', 'notify', 'listen', 'calculate', 'aim', 'open', )); }
protected function getVarNameGrammarSet() { return $this->buildGrammarSet('varname', array( 'is_something', 'object', 'name', 'token', 'label', 'piece_of_the_pie', 'type', 'state', 'param', 'action', 'key', 'timeout', 'result', )); }
protected function getNullExprGrammarSet() { return $this->buildGrammarSet('null', array('null')); }
protected function getNumberGrammarSet() { return $this->buildGrammarSet('number', array( mt_rand(-1, 100), mt_rand(-100, 1000), mt_rand(-1000, 5000), mt_rand(0, 1).'.'.mt_rand(1, 1000), mt_rand(0, 50).'.'.mt_rand(1, 1000), )); }
protected function getExprGrammarSet() { return $this->buildGrammarSet('expr', array( '[null]', '[number]', '[number]', '[varname]', '[varname]', '[boolval]', '[boolval]', '[boolexpr]', '[boolexpr]', '[funccall]', '[arithexpr]', '[arithexpr]', // Some random strings '"'.Filesystem::readRandomCharacters(4).'"', '"'.Filesystem::readRandomCharacters(5).'"', )); }
protected function getBoolExprGrammarSet() { return $this->buildGrammarSet('boolexpr', array( '[varname]', '![varname]', '[varname] == [boolval]', '[varname] != [boolval]', '[ternary]', )); }
protected function getBoolValGrammarSet() { return $this->buildGrammarSet('boolval', array( 'true', 'false', )); }
protected function getArithExprGrammarSet() { return $this->buildGrammarSet('arithexpr', array( '[varname]++', '++[varname]', '[varname] + [number]', '[varname]--', '--[varname]', '[varname] - [number]', )); }
protected function getAssignmentGrammarSet() { return $this->buildGrammarSet('assignment', array( '[varname] = [expr]', '[varname] = [arithexpr]', '[varname] += [expr]', )); }
protected function getCondGrammarSet() { return $this->buildGrammarSet('cond', array( 'if ([boolexpr]) {[stmt, indent, block]}', 'if ([boolexpr]) {[stmt, indent, block]} else {[stmt, indent, block]}', )); }
protected function getLoopGrammarSet() { return $this->buildGrammarSet('loop', array( 'while ([boolexpr]) {[stmt, indent, block]}', 'do {[stmt, indent, block]} while ([boolexpr])[term]', 'for ([assignment]; [boolexpr]; [expr]) {[stmt, indent, block]}', )); }
protected function getTernaryExprGrammarSet() { return $this->buildGrammarSet('ternary', array( '[boolexpr] ? [expr] : [expr]', )); }
protected function getStmtTerminationGrammarSet() { return $this->buildGrammarSet('term', array('')); }
}