- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试生成一个带有一些额外功能的样式表解析器来尝试 jison。如何实现 import 指令将其他文件加载到主文件中?我有点困惑。有没有办法在语法文件中使用词法分析器?我可以读取该文件然后对其进行标记吗?
grammar.jison
%{
var nodes = require('./nodes')
%}
%%
// Parsing starts here.
stylesheet:
statements EOF { return new nodes.StyleSheet($1) }
;
statements:
/* empty */ { $$ = [] }
| statementGroup { $$ = $1 }
| statements ';' statementGroup { $$ = $1.concat($3) }
| statements ';' { $$ = $1 }
;
statementGroup:
statement { $$ = [ $1 ] }
| rules
| rules statement { $$ = $1.concat($2) }
;
statement:
variableDeclaration
;
rules:
rule { $$ = [ $1 ] }
| rules rule { $$ = $1.concat($2) }
;
rule:
selector '{' declarations '}' { $$ = new nodes.Rule($1, $3) }
;
selector:
IDENTIFIER
| SELECTOR
;
declarations:
/* empty */ { $$ = [] }
| declarationGroup { $$ = $1 }
| declarations ';' declarationGroup { $$ = $1.concat($3) }
| declarations ';' { $$ = $1 }
;
declarationGroup:
declaration { $$ = [ $1 ] }
| rules
| rules declaration { $$ = $1.concat($2) }
;
declaration:
property
| variableDeclaration
;
property:
IDENTIFIER ':' values { $$ = new nodes.Property($1, $3) }
;
variableDeclaration:
VARIABLE ':' values { $$ = new nodes.Assign($1, $3) }
;
values:
value { $$ = [ $1 ] }
| values value { $$ = $1.concat($2) }
;
value:
IDENTIFIER { $$ = new nodes.Literal($1) }
| COLOR { $$ = new nodes.Literal($1) }
| NUMBER { $$ = new nodes.Literal($1) }
| DIMENSION { $$ = new nodes.Literal($1) }
| VARIABLE { $$ = new nodes.Variable($1) }
;
tokens.jisonlex
// Order is important. Rules are matches from top to bottom.
//// Macros
DIGIT [0-9]
NUMBER {DIGIT}+(\.{DIGIT}+)? // matches: 10 and 3.14
NAME [a-zA-Z][\w\-]* // matches: body, background-color and myClassName
SELECTOR (\.|\#|\:\:|\:){NAME} // matches: #id, .class, :hover and ::before
PATH (.+)/([^/]+) // matches ./bla/bla/nested.sss
%%
//// Rules
\s+ // ignore spaces, line breaks
// Numbers
{NUMBER}(px|em|\%) return 'DIMENSION' // 10px, 1em, 50%
{NUMBER} return 'NUMBER' // 0
\#[0-9A-Fa-f]{3,6} return 'COLOR' // #fff, #f0f0f0
// Selectors
{SELECTOR} return 'SELECTOR' // .class, #id
{NAME}{SELECTOR} return 'SELECTOR' // div.class, body#id
\@{NAME} return 'VARIABLE' // @variable
{NAME} return 'IDENTIFIER' // body, font-size
. return yytext // {, }, +, :, ;
<<EOF>> return 'EOF'
nodes.js
var Context = require('./context').Context
var compressed
function StyleSheet(rules, ss) {
this.rules = rules
this.ss = ss ? ss : []
}
exports.StyleSheet = StyleSheet
StyleSheet.prototype.toCSS = function(output) {
compressed = output || false
var context = new Context()
var ret = this.rules.map(function (rule) {
return rule.toCSS(context) }).filter(function (value) { return typeof value !== 'undefined' }).join('\n')
return compressed ? ret.replace(/\s+/g, '') : ret
}
function Rule(selector, declarations) {
this.selector = selector
this.declarations = declarations
}
exports.Rule = Rule
Rule.prototype.toCSS = function(parentContext) {
var propertiesCSS = [],
nestedRulesCSS = [],
context = new Context(this, parentContext)
this.declarations.forEach(function(declaration) {
var css = declaration.toCSS(context)
if (declaration instanceof Property) {
propertiesCSS.push(css)
} else if (declaration instanceof Rule) {
nestedRulesCSS.push(css)
}
})
return [ context.selector() + ' { ' + propertiesCSS.join(' ') + ' }' ].
concat(nestedRulesCSS).
join('\n')
}
function Property(name, values) {
this.name = name
this.values = values
}
exports.Property = Property
Property.prototype.toCSS = function(context) {
var valuesCSS = this.values.map(function(value) { return value.toCSS(context) })
return this.name + ': ' + valuesCSS.join(' ') + ';'
}
function Literal(value) {
this.value = value
}
exports.Literal = Literal
Literal.prototype.toCSS = function() {
return this.value
}
function Variable(name) {
this.name = name
}
exports.Variable = Variable
Variable.prototype.toCSS = function(context) {
return context.get(this.name)
}
function Assign(name, values) {
this.name = name
this.values = values
}
exports.Assign = Assign
Assign.prototype.toCSS = function(context) {
var valuesCSS = this.values.map(function(value) { return value.toCSS(context) })
context.set(this.name, valuesCSS.join(' '))
}
最佳答案
据我所知,基本的 jison 词法分析器不允许增量输入;您需要给它一个它标记的字符串。
但是,您可以使用自己的自定义词法分析器(包括调用 jison 词法分析器)来进行增量词法分析。因此,您的自定义词法分析器需要实现输入堆栈来实现包含命令。尽管我手头没有例子,但这应该不是特别困难。
关于javascript - 为 jison 生成的 css präprozessor 语言定义导入语句的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261596/
可以在以下位置找到以下代码片段:http://zaach.github.io/jison/demos/calc/ ,以及 jison 文档页面。阅读 jison、lex 和 flex 文档后 - 我仍
嗨,我是 JISON 的新手,并陷入了以下代码: 用于解析命令: project -a -n 我的代码如下: "project" {return 'PROJECTCOMMAND';} "-n
我使用 JISON 生成了一个解析器: %lex %x TEXT %% ("Project"|"project") {return 'PROJECTCOMMAND';} "-au" {return '
我现在在一个看起来很容易解决的问题面前坐了几个小时,但我就是无法解决它:/ 我正在 jison 中定义一种小型的类似 javascript 的语言。问题是参数规则和AssignStatement 规则
我正在尝试使用 Jison 编写解析器这将解析 javap 工具的输出。这是我的 .jison 文件的内容: %lex %x classfile %% "Classfile"
我正在尝试使用 Jison。 这是我的语法: var grammar = { lex:{ rules:[ ["\\s+", ""], ["
我正在努力了解 Jison。不过我有点麻烦。下面的解析器总是返回 [],不管你给它什么。 %lex %% "data"\s* return 'DATA' [A-Za-z][A-
我已经使用 Jison 编写了一个解析器,它能够通过运算符和 bool 运算支持处理类似 google 的搜索查询。目前,我很难弄清楚如何接受 AND OR 和 NOT 运算符之间的空格。任何帮助将不
我有一个简单的文件格式,我想用 jison 解析器生成器进行解析。该文件可以由任意顺序和数量的多个表达式组成。这是解析器的 jison 文件: /* lexical grammar */ %lex %
在尝试设置我的 Jison 语法时,我有: %left 'OR' 'AND' %% Expression: Operation ; Operation: Expression Oper
我正在研究模板系统的语法。我在构建中遇到了障碍,我不太清楚如何解决这个问题。我简化了测试用例,以最好地强调我正在做的事情。 示例字符串: (foo) - 作品 (foo()) - 失败Expectin
我正在尝试创建一种简单的脚本语言。一开始我只是想要类似的东西 i = 5; i += 3; out(i); 所以我为 jison 创建了以下语法: %lex %% \s+
我有一段 Jison 代码,如下所示: %lex %options flex %{ if (!('regions' in yy)) { yy.regions = []; } %} text
我正在使用 Jison 来添加新的自定义函数。从 Jison documentation 处的示例开始: { "lex": { "rules": [ ["
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
我正在通读 jison documentation其中一个示例给出了匹配文件末尾 ( > ) 的词法分析器规则。但是,只有在以 JISON 格式编写语法时才能使用它。相反,我使用 JSON 格式来描述
在 JISON 中,有没有办法为单个作品解析字符串?例如,这个原始解析器根据多个产品(例如 ary)定义了一个主 expressions。 现在这会返回一个可以解析表达式的函数: var parser
我正尝试在我的编程语言中添加对数组的支持,但遇到了问题 Array : '[' Expr ("," Expr)* ']' {{ $$ = ['ArrayList', $1]; }}
有没有办法将数据传递给 Jison,以便它可以在解析期间引用它?作为起始案例,假设我们正在使用 calculator.jison并想传递给它一个对象,比如说 var parser = new jiso
我是词法分析和解析的新手,如果标题不够清晰,我很抱歉。 基本上,我使用 Jison 来解析一些文本,并尝试让词法分析器理解缩进。这是有问题的部分: (\r\n|\r|\n)+\s* %{
我是一名优秀的程序员,十分优秀!