我正在尝试编写一个语法,可以识别dockerfile(上下文无关文法)。
简而言之,dockerfiles是由命令组成的文本文件。
一个命令可以是单行或多行,并通过其名称进行标识。
最简单的dockerfile命令示例:
到目前为止,我已经完成了以下工作:
那么有什么问题呢? 首先,ANYKEYS规则很不好看,但我找不到更好的方法来解决。 接下来,RUN exit 9000无法工作,会产生"extraneous input '9000' expecting {SHELLAND,ANYKEYS,NEWLINE}"的错误,我不理解,因为ANYKEYS应该与ANYKEY规则中的NUMBER匹配。
我有点迷惑了,不明白为什么它不能匹配这样的输入,并且也不知道用更好的方法怎么做。
谢谢你的帮助和建议!
最简单的dockerfile命令示例:
FROM anImageNameThatCanContainsPrettyMuchAnythingButWS
EXPOSE aNumber
还有一些更复杂的命令,例如:
ADD aPath anotherPath
COPY aPath anotherPath
ENV aKey=aValue
这里最复杂的命令是RUN命令。
RUN命令基本上可以是任何shell命令,因此可以是任何内容。我要做的唯一一件事就是通过“&&”来“拆分”RUN命令。到目前为止,我已经完成了以下工作:
grammar Dockerfile;
dockerfile: ((COMMENT | command))+ EOF;
COMMENT
: ( '#' ~[\r\n]* '\r'? '\n'
| '/*' .*? '*/'
) -> skip
;
command: one_line | run;
one_line: (from | env | entrypoint | maintainer | workdir | add | copy | expose) (NEWLINE)*;
from: FROM ANYKEYS;
maintainer: MAINTAINER ANYKEYS ANYKEYS;
env: ENV ANYKEYS '=' ANYKEYS;
entrypoint: ENTRYPOINT ANYKEYS;
workdir: WORKDIR ANYKEYS;
add: ADD .*?;
copy: COPY src dest;
src: ANYKEYS | '.';
dest: ANYKEYS | '.';
expose: EXPOSE NUMBER;
run: RUN body NEWLINE;
body: shellCmd (SHELLAND shellCmd)* ;
shellCmd: ANYKEYS+;
SHARP: '#';
FROM: [fF][rR][oO][mM];
ENV: [eE][nN][vV];
RUN: [rR][uU][nN];
ENTRYPOINT: [eE][nN][tT][rR][yY][pP][oO][iI][nN][tT];
MAINTAINER: [mM][aA][iI][nN][tT][aA][iI][nN][eE][rR];
WORKDIR: [wW][oO][rR][kK][dD][iI][rR];
SHELLAND: '&&' | ('\\' NEWLINE '&&');
ADD: [aA][dD][dD];
COPY: [cC][oO][pP][yY];
EXPOSE: [eE][xX][pP][oO][sS][eE];
NUMBER: [0-9]+;
LETTER: [a-zA-Z];
ANYKEYS: (LETTER | NUMBER | ':' | '_' | '-' | '/' | '|' | '"' | '=' | '*' | '\\' | '\'' | '+' | ']' | '[' | '{' | '}' | ';' | '!' | '~' | '.' | '–' | '$' | '<' | '>' | '@' | ',')+;
NEWLINE: ('\n' | '\r')+;
WS : ((' ' | '\t')+) -> skip;
那么有什么问题呢? 首先,ANYKEYS规则很不好看,但我找不到更好的方法来解决。 接下来,RUN exit 9000无法工作,会产生"extraneous input '9000' expecting {SHELLAND,ANYKEYS,NEWLINE}"的错误,我不理解,因为ANYKEYS应该与ANYKEY规则中的NUMBER匹配。
我有点迷惑了,不明白为什么它不能匹配这样的输入,并且也不知道用更好的方法怎么做。
谢谢你的帮助和建议!
ANYKEYS
移到语法的结尾不会改变任何事情,我错了吗?所以我现在不知道该怎么做才能解决这个问题?使用模式能解决这个问题吗? 如果我正确理解了词法分析器模式,它可以用来在语法中引入一种上下文,避免类似于RUN
在RUN
主体内部被解释为运行命令的歧义情况。 - ttben