Path: blob/master/src/infrastructure/lipsum/code/PhutilCodeSnippetContextFreeGrammar.php
12256 views
<?php12/**3* Generates non-sense code snippets according to context-free rules, respecting4* indentation etc.5*6* Also provides a common ruleset shared among many mainstream programming7* languages (that is, not Lisp).8*/9abstract class PhutilCodeSnippetContextFreeGrammar10extends PhutilContextFreeGrammar {1112public function generate() {13// A trailing newline is favorable for source code14return trim(parent::generate())."\n";15}1617final protected function getRules() {18return array_merge(19$this->getStartGrammarSet(),20$this->getStmtGrammarSet(),21array_mergev($this->buildRuleSet()));22}2324abstract protected function buildRuleSet();2526protected function buildGrammarSet($name, array $set) {27return array(28$name => $set,29);30}3132protected function getStartGrammarSet() {33return $this->buildGrammarSet('start',34array(35"[stmt]\n[stmt]",36"[stmt]\n[stmt]\n[stmt]",37"[stmt]\n[stmt]\n[stmt]\n[stmt]",38));39}4041protected function getStmtGrammarSet() {42return $this->buildGrammarSet('stmt',43array(44'[assignment][term]',45'[assignment][term]',46'[assignment][term]',47'[assignment][term]',48'[funccall][term]',49'[funccall][term]',50'[funccall][term]',51'[funccall][term]',52'[cond]',53'[loop]',54));55}5657protected function getFuncNameGrammarSet() {58return $this->buildGrammarSet('funcname',59array(60'do_something',61'nonempty',62'noOp',63'call_user_func',64'getenv',65'render',66'super',67'derpify',68'awesomize',69'equals',70'run',71'flee',72'fight',73'notify',74'listen',75'calculate',76'aim',77'open',78));79}8081protected function getVarNameGrammarSet() {82return $this->buildGrammarSet('varname',83array(84'is_something',85'object',86'name',87'token',88'label',89'piece_of_the_pie',90'type',91'state',92'param',93'action',94'key',95'timeout',96'result',97));98}99100protected function getNullExprGrammarSet() {101return $this->buildGrammarSet('null', array('null'));102}103104protected function getNumberGrammarSet() {105return $this->buildGrammarSet('number',106array(107mt_rand(-1, 100),108mt_rand(-100, 1000),109mt_rand(-1000, 5000),110mt_rand(0, 1).'.'.mt_rand(1, 1000),111mt_rand(0, 50).'.'.mt_rand(1, 1000),112));113}114115protected function getExprGrammarSet() {116return $this->buildGrammarSet('expr',117array(118'[null]',119'[number]',120'[number]',121'[varname]',122'[varname]',123'[boolval]',124'[boolval]',125'[boolexpr]',126'[boolexpr]',127'[funccall]',128'[arithexpr]',129'[arithexpr]',130// Some random strings131'"'.Filesystem::readRandomCharacters(4).'"',132'"'.Filesystem::readRandomCharacters(5).'"',133));134}135136protected function getBoolExprGrammarSet() {137return $this->buildGrammarSet('boolexpr',138array(139'[varname]',140'![varname]',141'[varname] == [boolval]',142'[varname] != [boolval]',143'[ternary]',144));145}146147protected function getBoolValGrammarSet() {148return $this->buildGrammarSet('boolval',149array(150'true',151'false',152));153}154155protected function getArithExprGrammarSet() {156return $this->buildGrammarSet('arithexpr',157array(158'[varname]++',159'++[varname]',160'[varname] + [number]',161'[varname]--',162'--[varname]',163'[varname] - [number]',164));165}166167protected function getAssignmentGrammarSet() {168return $this->buildGrammarSet('assignment',169array(170'[varname] = [expr]',171'[varname] = [arithexpr]',172'[varname] += [expr]',173));174}175176protected function getCondGrammarSet() {177return $this->buildGrammarSet('cond',178array(179'if ([boolexpr]) {[stmt, indent, block]}',180'if ([boolexpr]) {[stmt, indent, block]} else {[stmt, indent, block]}',181));182}183184protected function getLoopGrammarSet() {185return $this->buildGrammarSet('loop',186array(187'while ([boolexpr]) {[stmt, indent, block]}',188'do {[stmt, indent, block]} while ([boolexpr])[term]',189'for ([assignment]; [boolexpr]; [expr]) {[stmt, indent, block]}',190));191}192193protected function getTernaryExprGrammarSet() {194return $this->buildGrammarSet('ternary',195array(196'[boolexpr] ? [expr] : [expr]',197));198}199200protected function getStmtTerminationGrammarSet() {201return $this->buildGrammarSet('term', array(''));202}203204}205206207